我有一个控制器UserController
这个动作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)));
});
}
我想写的,我抛出一个异常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
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)
[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呢?
- 我不想仅仅测试引发的异常。我想在响应的状态代码上声明。有什么办法做到这一点?
对这些行为及其原因的任何比较都会很棒!
您应该从公共任务获取(串domainUserName)的所有测试都是domainUser =“foo”和你表现是唯一的错误添加更多的代码为空的domainUser(或null) –
JleruOHeP
2013-03-26 10:29:51
@JleruOHeP - 谢谢-got带走了一点。编辑过代码。 – 2013-03-26 10:45:51
编辑完成后,所有的测试用例仍然是一样的吗?案例1仍然没有抛出任何异常? – JleruOHeP 2013-03-26 11:49:25