私は404の例外を投げた場合のテストを記述しようとしています。このアクションNUnitの非同期テスト例外アサーション
// GET /blah
public Task<User> Get(string domainUserName)
{
if (string.IsNullOrEmpty(domainUserName))
{
throw new ArgumentException("No username specified.");
}
return Task.Factory.StartNew(
() =>
{
var user = userRepository.GetByUserName(domainUserName);
if (user != null)
{
return user;
}
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, string.Format("{0} - username does not exist", domainUserName)));
});
}
とコントローラUserController
を持っています。ここで
は、私は、出力で、試してみましたが何である -
1)
[Test]
public void someTest()
{
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(x => x.GetByUserName(It.IsAny<string>())).Returns(default(User));
var userController = new UserController(mockUserRepository.Object) { Request = new HttpRequestMessage() };
Assert.That(async() => await userController.Get("foo"), Throws.InstanceOf<HttpResponseException>());
}
結果 テスト
Expected: instance of <System.Web.Http.HttpResponseException>
But was: no exception thrown
2)
[Test]
public void someTest()
{
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(x => x.GetByUserName(It.IsAny<string>())).Returns(default(User));
var userController = new UserController(mockUserRepository.Object) { Request = new HttpRequestMessage() };
var httpResponseException = Assert.Throws<HttpResponseException>(() => userController.Get("foo").Wait());
Assert.That(httpResponseException.Response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
失敗しました
結果 試験
Expected: <System.Web.Http.HttpResponseException>
But was: <System.AggregateException> (One or more errors occurred.)
3) テストが失敗
[Test]
public void someTest()
{
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(x => x.GetByUserName(It.IsAny<string>())).Returns(default(User));
var userController = new UserController(mockUserRepository.Object) { Request = new HttpRequestMessage() };
var httpResponseException = Assert.Throws<HttpResponseException>(async() => await userController.Get("foo"));
Assert.That(httpResponseException.Response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
検索結果を失敗
Expected: <System.Web.Http.HttpResponseException>
But was: null
4)
ExpectedExceptionがない場合、- はなぜAssert.ThrowsがHttpResponseExceptionを処理しません -
[Test] [ExpectedException(typeof(HttpResponseException))] public async void ShouldThrow404WhenNotFound() { var mockUserRepository = new Mock<IUserRepository>(); mockUserRepository.Setup(x => x.GetByUserName(It.IsAny<string>())).Returns(default(User)); var userController = new UserController(mockUserRepository.Object) { Request = new HttpRequestMessage() }; var task = await userController.Get("foo"); }
結果 テストは
質問を渡しますか?
- 例外がスローされたことをテストするだけではいけません。私は応答のステータスコードを主張したいと思います。これを行う方法は何ですか?
これらの動作とその原因の比較は素晴らしいでしょう。
あなたは、すべてのテストとして、あなたの公開タスク取得(文字列あるDomainUserName)からより多くのコードを追加する必要がありdomainUser =「foo」というためのもので、あなたが示した唯一の誤差があります空のdomainUser(またはnull)の場合 –
JleruOHeP
@ JleruOHeP - 感謝の念がちょっと持ち去られました。コードを編集しました。 –
あなたの編集後も、すべてのテストケースは同じですか?そしてケース1はまだ例外をスローしませんか? – JleruOHeP