可能有助於理解和使用依賴注入的第一件事。基本上取決於你的對象/方法/等的任何依賴關係和(因爲它說)將它們注入對象/方法/等。例如,您很難弄清楚如何測試該方法,因爲該方法依賴於能夠訪問Web服務。在此之後你可以做幾件事情。
要做的一件事就是檢查模擬框架,如Moq。
我最近做的另一件事是我添加了一個重載的構造函數(依賴注入),需要一個HttpMessageInvoker
對象(注意HttpClient
派生自此)。這樣一來,我可以用我自己的響應消息實例化類:
public class MyLoader()
{
protected HttpMessageInvoker MessageInvoker { get; set; }
private HttpRequestMessage requestMessage;
public MyLoader() // default constructor
{
MessageInvoker = new HttpClient();
}
public MyLoader(HttpMessageInvoker httpMessageInvoker)
{
MessageInvoker = httpMessageInvoker;
}
public object DoSomething()
{
var response = await MessageInvoker.SendAsync(requestMessage, cancellationTokenSource.Token);
}
這裏是我的模擬信息調用:
public class MockMessageInvoker : HttpMessageInvoker
{
public string ResponseString { get; set; }
public MockMessageInvoker(string responseString)
: base(new HttpClientHandler())
{
ResponseString = responseString;
}
public override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
return Task.Run<HttpResponseMessage>(() =>
{
HttpResponseMessage responseMessage = new HttpResponseMessage(
System.Net.HttpStatusCode.OK);
var bytes = Encoding.ASCII.GetBytes(ResponseString);
var stream = new System.IO.MemoryStream(bytes);
responseMessage.Content = new StreamContent(stream);
return responseMessage;
});
}
}
我可以把它所有像這樣:
MyLoader loader = new MyLoader(new MockMessageInvoker(validJsonResponse));
loader.DoSomething() // I've removed the dependency on the service and have control of the content in the response
這是快速和骯髒,但伎倆。
希望這會有所幫助。
感謝這有助於=),只是一件事情,如果我還想測試HttpClient上的異常,就像404異常例如 –
@edua_glz:然後模擬'_client'拋出的http異常。假設使用'new Mock().Setup(c => c.Get(It.IsAny ())。拋出()'。 –
abatishchev