在某些情况下,我并不关心抛出什么异常(只要抛出某个异常)。不幸的是,
Assert.Throws<Exception>(someDelegate);除非抛出Exception的实例(因此不是派生类的实例),否则不会传递。我知道我可以获得我想要的行为
Exception exception = Record.Exception(someDelegate);
Assert.NotNull(exception);但它读起来不对劲。我是不是在xUnit中遗漏了一些我想要的行为?这里有两个测试,它们表明了我的意思:
[Fact]
public void Throws_exception_and_passes() {
Exception exception = Record.Exception(
() => { throw new InvalidOperationException(); }
);
Assert.NotNull(exception);
}
[Fact]
public void Throws_exception_and_fails() {
Assert.Throws<Exception>(
() => { throw new InvalidOperationException(); }
);
}发布于 2010-12-15 22:55:35
根据此处的文档:
http://xunit.codeplex.com/wikipage?title=HowToUse&referringTitle=Home
你必须指定你想要抛出的异常类型。一般来说,这是一个很好的实践。您应该能够预测测试将抛出什么类型的异常的场景。您应该能够以一种允许您预测这一点的方式来设计您的方法和测试。
有一些方法可以绕过这一点,比如尝试捕捉自己,但你应该考虑改变一下你的设计。
发布于 2015-09-09 07:54:43
在提出这个问题时,它还不存在,但是现在可以使用Assert.ThrowsAny<Exception>来测试从Exception派生的任何异常(因此可以测试任何异常),以及诸如Assert.ThrowsAny<ArgumentException>之类的变体,它将测试从ArgumentException派生的任何异常等等。
发布于 2010-12-15 23:00:33
如果你想做你自己的Custom Assertion,xUnit不会妨碍你,比如:
public static bool Throws<T>(this Action action, bool discardExceptions = false)
where T : Exception
{
try
{
action.Invoke();
}
catch (T)
{
return true;
}
catch (Exception)
{
if (discardExceptions)
{
return false;
}
throw;
}
return false;
}或者:
public static bool Throws(this Action action)
{
try
{
action.Invoke();
}
catch (Exception)
{
return true;
}
return false;
}https://stackoverflow.com/questions/4431479
复制相似问题