আমি কীভাবে এএসপি.নেট এমভিসিতে মক ব্যবহার করে এইচটিটিপি কনটেক্সটকে উপহাস করব?


101
[TestMethod]
public void Home_Message_Display_Unknown_User_when_coockie_does_not_exist()
{
    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    context
        .Setup(c => c.Request)
        .Returns(request.Object);
    HomeController controller = new HomeController();

    controller.HttpContext = context; //Here I am getting an error (read only).
    ...
 }

আমার বেস কন্ট্রোলারের কাছে এই অনুরোধের কনটেক্সটটি পেতে ইনিশিয়ালের একটি ওভাররাইড রয়েছে। আমি এটি পাশ করার চেষ্টা করছি তবে আমি কিছু ভাল করছি না।

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
}

আমার অনুরোধকন্টেক্সট এবং ম্যাক ব্যবহার করে এইচটিটিপি কনটেক্সটকে উপহাস করার বিষয়ে আমি আরও তথ্য কোথায় পেতে পারি? আমি কুকিজ এবং সাধারণ প্রসঙ্গে উপহাস করার চেষ্টা করছি।

উত্তর:


61

এইচটিটিপি কনটেক্সট কেবল পঠনযোগ্য, তবে এটি আসলে আপনি নিয়ন্ত্রণ করতে পারেন এমন কন্ট্রোলার কনটেক্সট থেকে প্রাপ্ত।

 controller.ControllerContext = new ControllerContext( context.Object, new RouteData(), controller );

এই একজন আমাকে নিয়ামকটিতে একটি উপহাস এইচটিটিপি কনটেক্সট সেট করার অনুমতি দিয়ে আমার পক্ষে কাজ করেছিল।
জোয়েল ম্যালোন

39

একটি অনুরোধ, প্রতিক্রিয়া তৈরি করুন এবং তাদের উভয়ই এইচটিটিপি কনটেক্সটে রাখুন:

HttpRequest httpRequest = new HttpRequest("", "http://mySomething/", "");
StringWriter stringWriter = new StringWriter();
HttpResponse httpResponse = new HttpResponse(stringWriter);
HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse);

প্রশ্নটি * বেস ক্লাসগুলি সম্পর্কে, অর্থাৎ এইচটিটিপিআরকুয়েস্টবেস, এইচটিটিপিআরকুয়েস্ট নয় - কেন নিশ্চিত নয় যে কেন দুজনকেই আমার এবং এমনকি আরও বিরক্ত করা দরকার যে তারা "সিলড" রয়েছে। লগন ইউজারআইডেন্টিটি সেট করার কোনও উপায় নেই :(
ক্রিস কিম্পটন

যদি তারা আমার রেফারেন্স মার্শাল করে থাকে তবে এটি রিমোট করার মাধ্যমে এখনও সম্ভব, তাই এটি কোনও সমস্যা হওয়া উচিত নয়।
0100110010101

1
@ ক্রিসকিম্পটন: একটি সর্বশেষ অবলম্বন হিসাবে, সর্বদা প্রতিচ্ছবি থাকে ;-)
অলিভার

এটি নিয়ামকের সাথে সংযুক্ত করার সময় এটি কাজ করে: যেমন: controller.ControllerContext = new ControllerContext (new HttpContextWrapper (HTContextMock), নতুন রুটডেটা (), নিয়ামক);
আন্দ্রেয়াস ভেন্ডেল

হ্যাঁ. আপনি প্রকৃতপক্ষে সেট করতে পারেন। লগন ইউজারআইডেন্টিটি - _ পুনর্চালনা.সেটআপ (n => n.LogonUserIdentity)। রিটার্নস ((উইন্ডোজআইডেন্টিটি.গেটকারেন্ট));
কেভিনডিউস

12

ধন্যবাদ ব্যবহারকারী 0100110010101।

এটি আমার পক্ষে কাজ করেছে এবং নীচের কোডের জন্য টেস্টকেসটি লেখার সময় এখানে আমার একটি সমস্যা ছিল:

 var currentUrl = Request.Url.AbsoluteUri;

এবং এখানে লাইনগুলি যা সমস্যার সমাধান করেছে

HomeController controller = new HomeController();
//Mock Request.Url.AbsoluteUri 
HttpRequest httpRequest = new HttpRequest("", "http://mySomething", "");
StringWriter stringWriter = new StringWriter();
HttpResponse httpResponse = new HttpResponse(stringWriter);
HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse);
controller.ControllerContext = new ControllerContext(new HttpContextWrapper(httpContextMock), new RouteData(), controller);

অন্যদের জন্য সহায়ক হতে পারে।


আমি এইচটিটিপিআরকুয়েস্ট টাইপটি ব্যবহার করার মতো মনে করতে পারি না - এটি এখন অন্য কিছু?
ভিনসেন্ট বাসকারেলো

1
এটি দরকারি নয় কারণ HttpRequest মধ্যে সব ক্ষেত্র অপরিবর্তনীয় হয়
একটি বিআর

6

আপনি কীভাবে এটি সেট আপ করতে পারেন তার একটি উদাহরণ এখানে দেওয়া হয়েছে: ইউনিট টেস্টের জন্য ম্যাটক্টিং এইচটিপিপেক্সটেক্সট এইচটিপিআরেক্সেস্ট এবং এইচটিটিপি রেসপন্স (মোক ব্যবহার করে)

এক্সটেনশন পদ্ধতিগুলি নোট করুন যা এই উপহাসের ক্লাসগুলির ব্যবহারকে সহজতর করতে সত্যই সহায়তা করে:

var mockHttpContext = new API_Moq_HttpContext();

var httpContext = mockHttpContext.httpContext();

httpContext.request_Write("<html><body>".line()); 
httpContext.request_Write("   this is a web page".line());  
httpContext.request_Write("</body></html>"); 

return httpContext.request_Read();

এইচটিটিপি মডেলটি প্রত্যাশা অনুযায়ী কাজ করছে কিনা তা পরীক্ষা করতে moq ব্যবহার করে ইউনিট টেস্ট কীভাবে লিখবেন তার উদাহরণ এখানে: HTTPModule এর জন্য ইউনিট টেস্টটি Moq ব্যবহার করে HttpRequest মোড়ানোর জন্য

আপডেট: এই এপিআই এর সাথে রিফ্যাক্টর করা হয়েছে


লিঙ্কগুলি নষ্ট হয়ে গেছে - দয়া করে আপনার উত্তরে কোডটি অন্তর্ভুক্ত করুন
হেডিস

5

জাল অ্যাপ্লিকেশন পাথটি পাস করার জন্য আমি কীভাবে কন্ট্রোলার কনটেক্সট ব্যবহার করেছি:

[TestClass]
public class ClassTest
{
    private Mock<ControllerContext> mockControllerContext;
    private HomeController sut;

    [TestInitialize]
    public void TestInitialize()
    {
        mockControllerContext = new Mock<ControllerContext>();
        sut = new HomeController();
    }
    [TestCleanup]
    public void TestCleanup()
    {
        sut.Dispose();
        mockControllerContext = null;
    }
    [TestMethod]
    public void Index_Should_Return_Default_View()
    {

        // Expectations
        mockControllerContext.SetupGet(x => x.HttpContext.Request.ApplicationPath)
            .Returns("/foo.com");
        sut.ControllerContext = mockControllerContext.Object;

        // Act
        var failure = sut.Index();

        // Assert
        Assert.IsInstanceOfType(failure, typeof(ViewResult), "Index() did not return expected ViewResult.");
    }
}

1
আপনার কেন একটি ভুয়া অ্যাপ্লিকেশন পাথটি পাস করতে হবে?
the_law

এমভিসি কোড এটি কার্যকর করে এবং যদি এটি না থাকে তবে একটি নাল ব্যতিক্রম ছুঁড়ে দেবে।
জোশুয়া রামিরেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.