2009-02-12 11 views
6

के साथ एक HttpContext Response.Output का मज़ाक उड़ाते हुए मैं एक mocked HttpContext में गुजरने के लिए Hanselman's blog पर मिली MvcMockHelpers क्लास का उपयोग कर रहा हूं। हमने इसे कुछ प्रमाणीकरण डेटा जोड़ने के लिए कुछ हद तक विस्तारित किया है और अधिकांश भाग के लिए यह बहुत अच्छा रहा है।मॉक

हमारे पास यह मुद्दा यह है कि हम जिस संदर्भ में नियंत्रक को दे रहे हैं वह HttpContext.Response.Output में शून्य मान है, जो कुछ अपवादों को फेंकने का कारण बन रहा है। मुझे यकीन नहीं है कि यह काम करने के लिए क्या जोड़ना है।

public static HttpContextBase FakeHttpContext() 
{ 
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    var response = new Mock<HttpResponseBase>(); 
    var session = new Mock<HttpSessionStateBase>(); 
    var server = new Mock<HttpServerUtilityBase>(); 

    // Our identity additions ... 
    var user = new Mock<IPrincipal>(); 
    OurIdentity identity = (OurIdentity)Thread.CurrentPrincipal.Identity; 

    context.Expect(ctx => ctx.Request).Returns(request.Object); 
    context.Expect(ctx => ctx.Response).Returns(response.Object); 
    context.Expect(ctx => ctx.Session).Returns(session.Object); 
    context.Expect(ctx => ctx.Server).Returns(server.Object); 
    context.Expect(ctx => ctx.User).Returns(user.Object); 
    context.Expect(ctx => ctx.User.Identity).Returns(identity); 
    return context.Object; 
} 

यहाँ विस्फोट विधि है (जो MVC योगदान परियोजना की XmlResult का हिस्सा है):

यहाँ मौजूदा FakeHttpConext() विधि है

public override void ExecuteResult(ControllerContext context) 
{ 
    if (_objectToSerialize != null) 
    { 
     var xs = new XmlSerializer(_objectToSerialize.GetType()); 
     context.HttpContext.Response.ContentType = "text/xml"; 
     xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize); 
    } 
} 

क्या मैं जोड़ने की जरूरत है संदर्भ के दौरान शून्य अपवाद को रोकने के लिए FakeHttpContext विधि में। HttpContext.Response.Output संदर्भित है?

स्पष्टीकरण: मैं जो समाधान ढूंढ रहा हूं वह मोक में किया जाना चाहिए, राइनो नहीं। मैंने प्रश्न शीर्षक में मोक का उल्लेख किया लेकिन सवाल शरीर में उपेक्षित किया। किसी भी भ्रम के लिए खेद है।

var writer = new StringWriter(); 
context.Expect(ctx => ctx.Response.Output).Returns(writer); 

इस अशक्त अपवाद से बचाता है:

संकल्प मैं निम्नलिखित दो विधि FakeHttpContext() के लिए कोड की लाइनें गयी। सुनिश्चित नहीं है कि यह एक अच्छा जवाब लंबी अवधि है, लेकिन यह अब के लिए काम करता है।

उत्तर

3

MvcContrib फ़ाइल MvcMockHelps के लिए टेस्ट मैचों में यह कैसे किया जाता है पता चलता है।

+0

एमवीसी कंट्रीब प्रोजेक्ट राइनोमोक्स का उपयोग करता है, न कि मोक। मैं राइनो का उपयोग करके यूनिट टेस्ट को काम करने के लिए प्राप्त कर सकता हूं, लेकिन राइनो हमारे कार्यालय द्वारा मानकीकृत नहीं है। –

+1

आप क्या करने की जरूरत mockedRequest.Output के लिए एक कॉल एक TextWriter लौट सकते हैं और इस तरह के mockedRequest.OutputStream एक MemoryStream के रूप में एक धारा वापसी करते हैं। – Matthew

+0

हां ... यह वह हिस्सा है जिसे मैं नहीं जानता कि कैसे करना है। अभी भी विभिन्न चीजों की कोशिश कर रहा है। –

संबंधित मुद्दे