【发布时间】:2013-03-16 02:22:52
【问题描述】:
[编辑(2020 年 5 月)] - 据报道,此问题已在 NUnit 的较新版本中得到解决。请参阅Nunit.ThrowsAsync。 (参考this answer,感谢@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
-
[测试] 公共无效 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");
}
结果 测试通过
问题-
- 为什么 Assert.Throws 不处理 HttpResponseException,而 ExpectedException 处理?
- 我不想只测试抛出的异常。我想断言响应的状态代码。这样做的方法是什么?
对这些行为及其原因的任何比较都会很棒!
【问题讨论】:
-
您应该从您的公共 Task
Get(string domainUserName) 添加更多代码,因为您的所有测试都是针对 domainUser = "foo" 并且您显示的唯一错误是针对空 domainUser(或空) -
@JleruOHeP - 谢谢 - 有点忘乎所以。已编辑代码。
-
修改后所有的测试用例还是一样的吗?而且情况1仍然没有抛出任何异常?
-
@JleruOHeP - 是的,测试失败,没有抛出异常。
-
+1 个非常好的问题,帮助我发现了我的问题。
标签: c# nunit async-await