私は.netコアで単体テストに慣れようとしています。残念ながら、私はHttpClient
ラッパーが失敗したHttpResponseMessage
を返すようになっています。xunitでnullを返すHockpientラッパーを嘲笑しました
[Fact]
public async void TestHttpExceptionOnBadRequest()
{
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes("Test")))
{
var xmlSerializer = new Mock<IXmlSerializer>();
xmlSerializer.Setup(serializer => serializer.Deserialize(stream)).Returns(new object());
var httpClient = new Mock<IHttpHandler>();
httpClient.Setup(client => client.GetAsync("Test"))
.Returns(Task.FromResult(new HttpResponseMessage(HttpStatusCode.BadRequest)));
var postcodeLookup = new PostcodeLookupService(xmlSerializer.Object, httpClient.Object, "", "");
await Assert.ThrowsAsync<HttpRequestException>(async() => await postcodeLookup.SearchAsync("", ""));
}
}
を自分のサービスコードを以下に示します。ここでは
は私が作業を取得しようとしている私のテストです。問題はresponse.EnsureSuccessStatusCode();
がnullを返すことです。ここ
public async Task<PostcodeContainer> SearchAsync(string text, string container)
{
// add the query parameters to the query string
var query = _baseQueryString + "&text=" + WebUtility.UrlEncode(text);
query += "&container=" + WebUtility.UrlEncode(container);
// initiate client & response
var response = await _httpClient.GetAsync(query);
response.EnsureSuccessStatusCode();
return (PostcodeContainer)_serializer.Deserialize(await response.Content.ReadAsStreamAsync());
}
万全を期すためには、モックの目的のために私のIHttpHandler
定義です。
public interface IHttpHandler
{
HttpResponseMessage Get(string url);
HttpResponseMessage Post(string url, HttpContent content);
Task<HttpResponseMessage> GetAsync(string url);
Task<HttpResponseMessage> PostAsync(string url, HttpContent content);
}