2013-04-25 10 views
6

Chciałbym przetestować usługę ServiceStack.W ServiceStack można sfałszować obiekt Request.OriginalRequest dla testów jednostkowych?

Obecnie mam:

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

Gdzie RequireFormsAuthentication jest

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); 
     } 
    } 
} 

byłem wyśmiewany wszystkie zależności używane przez 'othercode()' i wszystko, co pozostaje, to rzeczy, które znajduje się w Usługa klasy podstawowej. Czy istnieje wzorzec/strategia/podejście/coś, czego mi brakuje, czyni to banalnym?

Odpowiedz

2

Przepraszam, że nie używam moq ... już to zrobiłem, używając RhinoMocks. Myślę, że koncepcja powinna przenieść się do moq. This może być dobrym źródłem, a także tym this.

W każdym razie myślę, że poniższy kod testowy powinien zacząć. Twój szew do kpiny Request.OriginalRequest zastępuje obiekt Service.RequestContext za pomocą fałszywego obiektu. Potem musisz wyśmiać wszystko poza tym. To będzie dużo "kpiny" i jeśli powtórzysz sobie "Kpisz ze mnie" za każdym razem, gdy kpisz z klasy, to prawie przyjemnie.

[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

To obejmuje sporo, faktycznie. Dzięki! Jeszcze jedno: czy wiesz, w jaki sposób mogę zastąpić "Wniosek" chronionego członka? (linia 4 w moim pierwszym bloku kodu zawiedzie się z NRE) – Robin

+0

Również ... wydaje się, że "HttpRequest" jest klasą zamkniętą i nie można jej wyśmiać. – Robin

+0

Tak, HttpReqeust jest zaplombowany. Myślę, że możesz zamiast tego przesłać do HttpRequestBase? Wiersz 12 (mockedRequestContext.Stub (x => x.Get ()). Return (mockedHttpRequest)) Powinien pozwolić na wyśmiewanie członka Request. – paaschpa

7

Oto jak wykonać test z Moq. Ta usługa szuka "klucza" i "wartości" w ciągu zapytania i innego parametru w DTO żądania. Usługa zwraca odpowiedź łańcuchową na podstawie podanej wartości.

[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

Pamiętaj, aby sprawdzić przestrzeń nazw: ServiceStack.ServiceInterface.Testing.
Tam można znaleźć MockRequestContext, którego można użyć w następujący sposób:

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

AboutService service = new AboutService 
{ 
    RequestContext = mockContext 
}; 
Powiązane problemy