リクエストの重複を防ぐ DelegatingHandler の統合テストを作成しようとしています。ハンドラーはデータベースをチェックして、リクエストが既に処理されているかどうかを確認し、前のリクエストがまだ実行されている間に重複したリクエストが行われた場合、407-Conflict を返します。
テストに次のコードがあります。
HttpClient client = new HttpClient();
var responseTask1 = client.PostAsJsonAsync(RequestUriWithDuplicatePrevention, ReadRequestContent("DuplicateRequestJsonContent.json"));
var responseTask2 = client.PostAsJsonAsync(RequestUriWithDuplicatePrevention, ReadRequestContent("DuplicateRequestJsonContent.json"));
var response1 = responseTask1.Result;
var response2 = responseTask2.Result;
両方の要求がまったく同時にデータベースに記録されています。2 番目のリクエストを一定期間遅らせるにはどうすればよいですか?
Thread.Sleep(500) を追加しようとしましたが、違いはないようです。
改訂されたコード
このコードはほとんどの場合機能しているように見えますが、100% 信頼できるわけではありません。
[TestMethod]
public void ShouldReturn407ConflictWhenDuplicateRequestSubmitted()
{
var results = ExecutePostRequests().Result;
Assert.AreEqual(HttpStatusCode.OK, results[0].StatusCode);
Assert.AreEqual(HttpStatusCode.Conflict, results[1].StatusCode);
}
private async Task<HttpResponseMessage[]> ExecutePostRequests()
{
HttpClient client = new HttpClient();
var task1 = ExecutePost(client, 0);
var task2 = ExecutePost(client, 4000);
var response1 = await task1;
var response2 = await task2;
return new[] {response1, response2};
}
private async Task<HttpResponseMessage> ExecutePost(HttpClient client, int delay)
{
await Task.Delay(delay);
return await client.PostAsync(RequestUriWithDuplicatePrevention,
ReadRequestContent("DuplicateRequestJsonContent.json"));
}
実行中の Web サービスには Thread.Sleep(5000) があります。