2013-04-25 10 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); 
     } 
    } 
} 

ある

I ')は(othercode' により使用すべての依存関係を嘲笑しましたし、すべてが残っていますが中だものですベースクラスのサービス。パターン/戦略/アプローチ/私はこれが些細なものになっていない何かがありますか?

答えて

2

moqを使用していないことをお詫び申し上げます...既にRhinoMockを使用して行われています。私はそのコンセプトをmoqに移すべきだと思う。 Thisは、これだけでなく、この良いリソースかもしれませんthis

とにかく、私は以下のテストコードを開始するべきだと思います。あなたの継ぎ目を模倣してRequest.OriginalRequestService.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

、実際:
そこでは、次のように使用することができますMockRequestContextを見つけることができます。ありがとう!しかしもう1つのこと:保護されたメンバーの「要求」をどのように無効にできるか知っていますか? (私の最初のコードブロックの4行目はNREで失敗します) – Robin

+0

また、 'HttpRequest'は密封されたクラスであり、嘲笑されないようです。 – Robin

+0

ええ、HttpReqeustは封印されています。代わりにHttpRequestBaseにキャストできると思いますか? 12行目(mockedRequestContext.Stub(x => x.Get ())。Return(mockedHttpRequest))リクエストメンバーをモックすることができます。 – paaschpa

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を必ず確認してください。

かなり多くをカバーしてい
var mockContext = new ServiceStack.ServiceInterface.Testing.MockRequestContext(); 
//do stuff to set it up if desired... 

AboutService service = new AboutService 
{ 
    RequestContext = mockContext 
}; 
関連する問題