Während Komponententests ist HttpContext
immer null
, da es normalerweise von IIS aufgefüllt wird. Sie haben ein paar Optionen dazu.
Natürlich könnten Sie die HttpContext
verspotten, (die Sie nicht wirklich tun sollten - Don't mock HttpContext !!!! Er läßt sich nicht spotten werden mag,!) ,. Sie sollten wirklich versuchen, weg von enger Kopplung mit HttpContext
überall in Ihrem Code zu bleiben. Versuchen Sie, es auf einen zentralen Bereich (SRP) zu beschränken;
Stattdessen herausfinden, was die Funktionalität ist, die Sie erreichen möchten, und eine Abstraktion entwerfen. Dadurch wird Ihr Code testbarer, da er nicht so eng an HttpContext
gekoppelt ist.
Anhand Ihres Beispiels suchen Sie nach Headerwerten. Dies ist nur ein Beispiel dafür, wie Sie Ihr Denken bei der Verwendung von HttpContext
ändern können.
Ihre ursprüngliche Beispiel hat dieses
var request = HttpContext.Current.Request;
var testName = request.Headers.GetValues("OS Type")[0];
Wenn Sie etwas suchen, wie dieses
var testName = myService.GetOsType();
Na dann einen Dienst erstellen, dass
public interface IHeaderService {
string GetOsType();
}
bietet, die eine haben könnte konkrete Implementierung wie
public class MyHeaderService : IHeaderService {
public string GetOsType() {
var request = HttpContext.Current.Request;
var testName = request.Headers.GetValues("OS Type")[0];
return testName;
}
}
Jetzt in Ihrem Controller können Sie Ihre Abstraktion haben stattdessen eine enge Kopplung an HttpContext
public class MyApiController : ApiController {
IHeaderService myservice;
public MyApiController(IHeaderService headers) {
myservice = headers;
}
public IHttpActionResult Post([FromBody]TestDTO model) {
var testName = myService.GetOsType();
// more code
}
}
des Habens können Sie später Ihre konkreten Typ injizieren, um die Funktionalität, die Sie wollen zu bekommen.
Zum Testen tauschen Sie dann Abhängigkeiten aus, um Ihren Test auszuführen.
Wenn die Methode im Test Ihre Post()
Methode ist, können Sie eine gefälschte Abhängigkeit erstellen oder einen Mockframework verwenden
[TestClass]
public class MyTestClass {
public class MyFakeHeaderService : IHeaderService {
string os;
public MyFakeHeaderService(string os) {
this.os = os;
}
public string GetOsType() {
return os;
}
}
[TestMethod]
public void TestPostMethod() {
//Arrange
IHeaderService headers = new MyFakeHeaderService("FAKE OS TYPE");
var sut = new MyApiController(headers);
var model = new TestDTO();
//Act
sut.Post(model);
//Assert
//.....
}
}
Es macht Sinn, wenn Sie eine Controller-Methode aus einem Testprojekt aufrufen. Es gibt keinen http-Kontext, da Sie keine Webanwendung ausführen. Lösung ist, die Anfrage zu verspotten. – derloopkat
Wie verspottet es die Anfrage? Kannst du ein einfaches Beispiel teilen? – simbada
http://stackoverflow.com/questions/3195839/asp-net-mvc-rhino-mocks-mocking-httprequest-values – derloopkat