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


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.