2013-04-25 5 views
6

मैं अपनी सर्विसस्टैक सेवा टेस्ट करने योग्य बनाना चाहता हूं।सर्विसस्टैक में यूनिट परीक्षणों के लिए Request.OriginalRequest ऑब्जेक्ट का नकल करना संभव है?

वर्तमान में मेरे पास है:

[RequireFormsAuthentication] 
public object Delete(DeleteRequest request) 
{ 
    var originalRequest = (HttpRequest)Request.OriginalRequest; 
    var identity = originalRequest.RequestContext.HttpContext.User.Identity; 
    return othercode(identity); 
} 

कहाँ RequireFormsAuthentication

public class RequireFormsAuthenticationAttribute : RequestFilterAttribute 
{ 
    public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto) 
    { 
     var originalRequest = (HttpRequest)req.OriginalRequest; 
     var identity = originalRequest.RequestContext.HttpContext.User.Identity; 
     if (!identity.IsAuthenticated) 
     { 
      res.StatusCode = (int)HttpStatusCode.Forbidden; 
      res.EndServiceStackRequest(skipHeaders: true); 
     } 
    } 
} 

मैं सभी के द्वारा प्रयोग किया निर्भरता बाहर मज़ाक उड़ाया है 'othercode()' है और जो कुछ बचा है सामान में है वह यह है कि बेस क्लास सेवा। क्या कोई पैटर्न/रणनीति/दृष्टिकोण/कुछ ऐसा है जो मुझे याद आ रहा है जो यह छोटा बनाता है?

उत्तर

2

मैं moq का उपयोग न करने के लिए क्षमा चाहता हूं ... पहले से ही इनमें से कुछ RhinoMocks का उपयोग करके किया गया था। मुझे लगता है कि अवधारणा को moq में स्थानांतरित करना चाहिए। This एक अच्छा संसाधन हो सकता है साथ ही यह this हो सकता है।

वैसे भी, मुझे लगता है कि नीचे दिए गए टेस्ट कोड को आपको प्रारंभ करना चाहिए। Request.OriginalRequest मॉकिंग में आपका सीमको नकली ऑब्जेक्ट के साथ बदल रहा है। तो आपको बस उससे परे सब कुछ नकल करना होगा। यह बहुत सारे 'मॉकिंग' होने जा रहा है और यदि आप कक्षा में नकली करते हैं तो आप खुद को दोहराते हैं 'क्या आप मुझे मजाक कर रहे हैं' यह लगभग आनंददायक है।

[Test] 
public void testsomethign() 
{ 
    var mockedRequestContext = MockRepository.GenerateMock<IRequestContext>(); 
    var mockedHttpRequest = MockRepository.GenerateMock<IHttpRequest>(); 
    var mockedOriginalRequest = MockRepository.GenerateMock<HttpRequestBase>(); 
    var mockedOriginalRequestContext = MockRepository.GenerateMock<RequestContext>(); 

    mockedOriginalRequest.Stub(x => x.RequestContext).Return(mockedOriginalRequestContext); 
    mockedHttpRequest.Stub(x => x.OriginalRequest).Return(mockedOriginalRequest); 

    mockedRequestContext.Stub(x => x.Get<IHttpRequest>()).Return(mockedHttpRequest); 
    var service = new ServiceTests() 
    { 
     RequestContext = mockedRequestContext 
    }; 

    service.Delete(new DeleteRequest()); 
} 
+0

काफी एक बहुत कुछ शामिल किया गया है कि, वास्तव में:
वहाँ में आप एक MockRequestContext है कि आप इस प्रकार का उपयोग कर सकते पा सकते हैं। धन्यवाद! एक और बात, हालांकि: क्या आप जानते हैं कि मैं संरक्षित सदस्य 'अनुरोध' को कैसे ओवरराइड कर सकता हूं? (मेरे पहले कोड ब्लॉक में लाइन 4 एनआरई के साथ असफल हो जाएगी) – Robin

+0

इसके अलावा ... ऐसा लगता है कि 'HttpRequest' एक मुहरबंद वर्ग है और इसे मजाक नहीं किया जा सकता है। – Robin

+0

हाँ, HttpReqeust मुहरबंद है मुझे लगता है कि आप इसके बजाय HttpRequestBase पर जा सकते हैं? लाइन 12 (mockedRequestContext.Stub (x => x.Get ())। वापसी (mockedHttpRequest)) आपको अनुरोध सदस्य का नकल करने की अनुमति देनी चाहिए। – paaschpa

7

यहां Moq के साथ परीक्षण करने का तरीका बताया गया है। यह सेवा क्वेरी स्ट्रिंग में "कुंजी" और "मान" और अनुरोध डीटीओ में एक और पैरामीटर की तलाश में है। सेवा दिए गए मूल्य के आधार पर एक स्ट्रिंग प्रतिक्रिया देता है। ServiceStack.ServiceInterface.Testing:

[Test] 
    public void MyTest() 
    { 
     var mockRequestContext = new Mock<IRequestContext>(); 
     var mockedHttpRequest = new Mock<IHttpRequest>(); 

     NameValueCollection querystring = new NameValueCollection(); 
     querystring.Add("myKey", "myValue"); 

     mockedHttpRequest.SetupGet(r => r.QueryString).Returns(querystring); 

     mockRequestContext.Setup(x => x.Get<IHttpRequest>()).Returns(mockedHttpRequest.Object); 

     AboutService service = new AboutService 
     { 
      RequestContext = mockRequestContext.Object, 
     }; 

     AboutResponse response = (AboutResponse)service.Any(new About 
     { 
      Company = "myOtherValue", 
     }); 

     Assert.AreEqual(0, response.QueryResult); 
     Assert.AreEqual("validResponse", response.Version); 
    } 
2

नाम स्थान की जाँच करने के लिए सुनिश्चित करें।

var mockContext = new ServiceStack.ServiceInterface.Testing.MockRequestContext(); 
//do stuff to set it up if desired... 

AboutService service = new AboutService 
{ 
    RequestContext = mockContext 
}; 
संबंधित मुद्दे