2013-04-25 7 views
6

Vorrei rendere verificabile il servizio ServiceStack.In ServiceStack è possibile simulare l'oggetto Request.OriginalRequest per i test unitari?

Attualmente ho:

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

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

ho preso in giro tutte le dipendenze utilizzato da 'othercode()' e tutto quello che resta è la roba che c'è nella Servizio di classe base. C'è un modello/strategia/approccio/qualcosa che mi manca che rende questo banale?

risposta

2

Mi scuso per non aver usato moq ... già un po 'di questo ha fatto usando RhinoMocks. Penso che il concetto dovrebbe trasferirsi su moq. This potrebbe essere una buona risorsa così come questo this.

In ogni caso, penso che il codice di prova riportato di seguito dovrebbe iniziare. La tua cucitura in derisione Request.OriginalRequest sta sostituendo lo Service.RequestContext con un oggetto fittizio. Quindi devi solo prendere in giro tutto ciò che va oltre. Sarà molto "beffardo" e se ripeti a te stesso "Mi stai prendendo in giro" ogni volta che prendi in giro una lezione è quasi divertente.

[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

che copre un bel po ', in realtà. Grazie! Un'altra cosa, tuttavia: sai come posso ignorare la richiesta 'membro' protetta? (la riga 4 del mio primo blocco di codice fallirà con NRE) – Robin

+0

Inoltre ... sembra che "HttpRequest" sia una classe chiusa e non possa essere derisa. – Robin

+0

Sì, HttpReqeust è sigillato Penso che puoi lanciare su HttpRequestBase invece? Riga 12 (mockedRequestContext.Stub (x => x.Get ()). Return (mockedHttpRequest)) Dovrebbe permetterti di prendere in giro il membro della richiesta. – paaschpa

7

Ecco come eseguire il test con Moq. Questo servizio cerca "chiave" e "valore" nella stringa di query e un altro parametro nel DTO della richiesta. Il servizio restituisce una risposta stringa in base al valore indicato.

[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

Assicurarsi di controllare lo spazio dei nomi: ServiceStack.ServiceInterface.Testing.
Lì è possibile trovare un MockRequestContext che è possibile utilizzare il seguente:

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

AboutService service = new AboutService 
{ 
    RequestContext = mockContext 
}; 
Problemi correlati