zhu*_*ien 13 c# unit-testing entity-framework
我正在使用Visual Studio的集成框架编写一些单元测试.我需要编写一些测试用例,在抛出适当的异常时传递.问题是我需要测试的异常是嵌套在更一般的异常中的内部异常.是否有一些简单的解决方案或我是否需要扩展整个功能.我目前正在使用[ExpectedException]属性,但在这种情况下它不会有很多好处.
我也很好奇当我们使用[ExpectedException]时会发生什么,而我们在测试中也有一些Assert逻辑.是否评估了条件(抛出异常并且Assert语句结果有效)或者在抛出正确的异常后立即通过测试?
Loo*_*fer 15
不是一个完整的解决方案,但在Nunit你可以做这种事情
var ex = Assert.Throws<Exception>(() => thing.ThatThrows());
Assert.That(ex.InnerException, Is.TypeOf<BadException>() );
Run Code Online (Sandbox Code Playgroud)
也许你可以在你的测试框架中?
k.m*_*k.m 15
如果您的框架不支持自定义投掷,您通常有两种选择:
我将从第二个解决方案开始.考虑使用FluentAssertions库.它允许你做这样的事情:
Action deleteUser = () => usersRepository.Delete(new User { Id = null });
deleteUser
.ShouldThrow<UserNotFoundException>()
.WithInnerException<ArgumentNullException>()
.WithInnerMessage("User Id must have value");
Run Code Online (Sandbox Code Playgroud)
你仍然会使用Visual Studio测试框架,只需要有一个额外的库,流畅的断言.
另一方面,第一选择是更多的工作,因为通常情况下手卷解决方案:
try
{
usersRepository.Delete(new User { Id = null });
Assert.Fail("Deleting user with null id should throw");
}
catch (UserNotFoundException ue)
{
Assert.AreEqual(ue.InnerException.Message, "User Id must have value");
}
Run Code Online (Sandbox Code Playgroud)
您可以ExpectedException使用自定义代码替换属性来断言实际的异常实例.就像我说的那样,这是一项更多的工作但却有所帮助.
这是一个老问题,但我想ExpectedInnerExceptionAttribute与你们分享我自己的实现。也许对某人有用
public class ExpectedInnerExceptionAttribute : ExpectedExceptionBaseAttribute
{
public ExpectedInnerExceptionAttribute(Type exceptionType)
{
this.ExceptionType = exceptionType;
}
public Type ExceptionType { get; private set; }
protected override void Verify(Exception ex)
{
if (ex != null && ex.InnerException != null
&& ex.InnerException.GetType() == this.ExceptionType)
{
return;
}
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以扩展它以检查异常消息等。您只需要在验证方法中添加您自己的逻辑即可。