2013-04-25 86 views
6

我想讓我的ServiceStack服務可測試。在ServiceStack中可以模擬單元測試的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正在用模擬對象取代Service.RequestContext。那麼你只需要嘲笑一切。這將會是很多'嘲弄',如果你重複自己'你是否在嘲笑我',每當你嘲笑一個班級,這幾乎是愉快的。

[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

這涵蓋了很多,其實。謝謝!但是,還有一件事:你知道我怎麼可以重寫受保護的成員'請求'? (我的第一個代碼塊中的第4行將失敗,NRE) – Robin 2013-04-26 10:22:47

+0

另外...它似乎'HttpRequest'是一個密封的類,不能被嘲笑。 – Robin 2013-04-26 11:54:43

+0

是啊,HttpReqeust是密封的我認爲你可以轉換爲HttpRequestBase呢?第12行(mockedRequestContext.Stub(x => x.Get ())。Return(mockedHttpRequest))應該允許你模擬Request成員。 – paaschpa 2013-04-26 16:51:25

7

以下是如何使用Moq進行測試。此服務在查詢字符串和請求DTO中的另一個參數中查找「鍵」和「值」。該服務根據給定的值返回字符串響應。

[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

務必檢查名稱空間:ServiceStack.ServiceInterface.Testing。
在那裏你可以找到一個MockRequestContext,您可以使用如下:

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

AboutService service = new AboutService 
{ 
    RequestContext = mockContext 
}; 
相關問題