Web API
呼び出しを行うサービスのメソッドをテストしています。HttpClient
ローカルでWebサービス(ソリューションの別のプロジェクトにある)も実行している場合は、単体テストで通常の方法を使用するとうまくいきます。
ただし、変更をチェックインすると、ビルドサーバーはWebサービスにアクセスできないため、テストは失敗します。
私は、ユニットテスト用にIHttpClient
インターフェイスを作成し、アプリケーションで使用するバージョンを実装することで、これを回避する方法を考案しました。単体テストでは、モック化された非同期postメソッドを使用して、モック化されたバージョンを完成させます。ここで問題が発生しました。HttpStatusResult
この特定のテストに対してOKを返したいのですが。別の同様のテストでは、悪い結果が返されます。
テストは実行されますが、完了することはありません。待ちに待っています。私は非同期プログラミング、デリゲート、Moq自体に不慣れで、しばらくの間SOとグーグルを検索してきましたが、まだこの問題を乗り越えられないようです。
これが私がテストしようとしている方法です:
public async Task<bool> QueueNotificationAsync(IHttpClient client, Email email)
{
// do stuff
try
{
// The test hangs here, never returning
HttpResponseMessage response = await client.PostAsync(uri, content);
// more logic here
}
// more stuff
}
これが私の単体テスト方法です:
[TestMethod]
public async Task QueueNotificationAsync_Completes_With_ValidEmail()
{
Email email = new Email()
{
FromAddress = "bob@example.com",
ToAddress = "bill@example.com",
CCAddress = "brian@example.com",
BCCAddress = "ben@example.com",
Subject = "Hello",
Body = "Hello World."
};
var mockClient = new Mock<IHttpClient>();
mockClient.Setup(c => c.PostAsync(
It.IsAny<Uri>(),
It.IsAny<HttpContent>()
)).Returns(() => new Task<HttpResponseMessage>(() => new HttpResponseMessage(System.Net.HttpStatusCode.OK)));
bool result = await _notificationRequestService.QueueNotificationAsync(mockClient.Object, email);
Assert.IsTrue(result, "Queue failed.");
}
何が悪いのですか?
ご協力ありがとうございました。