[編集(2020年5月)] -この問題は、NUnitの新しいリリースで対処されたと報告されています。Nunit.ThrowsAsyncを参照してください。(この回答を参照してください、@ James-Rossに感謝します)
UserControllerこのアクションのコントローラーがあります
// 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)));
                });
}
404例外をスローした場合のテストを作成しようとしています。
これが私が試したもので、出力があります-
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
[テスト]publicvoid someTest(){var mockUserRepository = new Mock(); mockUserRepository.Setup(x => x.GetByUserName(It.IsAny()))。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.)
[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
[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");
}
結果 テストに合格
質問-
- ExpectedExceptionが処理するのに、Assert.ThrowsがHttpResponseExceptionを処理しないのはなぜですか?
 - 例外がスローされることをテストしたくありません。応答のステータスコードを主張したい。これを行う方法は何ですか?
 
これらの動作とその原因についての比較は素晴らしいでしょう!