我正在尝试检查异步方法是否会抛出具体异常。
为此我使用的是MSTEST和FluentAssertions 2.0.1。
我已经检查了这个Discussion on Codeplex,看看它如何与异步异常方法一起使用另一个关于FluentAssertions async tests的链接:
在尝试使用我的'生产'代码后,我已经关闭了Fluentassertions假的aync类,我的结果代码是这样的(将此代码放在[TestClass]
中:
[TestMethod]
public void TestThrowFromAsyncMethod()
{
var asyncObject = new AsyncClass();
Action action = () =>
{
Func<Task> asyncFunction = async () =>
{
await asyncObject.ThrowAsync<ArgumentException>();
};
asyncFunction.ShouldNotThrow();
};
}
internal class AsyncClass
{
public async Task ThrowAsync<TException>()
where TException : Exception, new()
{
await Task.Factory.StartNew(() =>
{
throw new TException();
});
}
public async Task SucceedAsync()
{
await Task.FromResult(0);
}
}
问题是ShouldNotThrow
无效:
代码无法识别ShouldNotThrow方法。如果我试着 编译,它给了我这个错误: 'System.Func'不包含 'ShouldNotThrow'的定义和最佳扩展方法重载 “FluentAssertions.AssertionExtensions.ShouldNotThrow(System.Action, string,params object [])'有一些无效的参数
感谢。
2.0.1 FA版本不支持此ShouldNotThrow
功能,它将包含在下一个版本2.1(下周附近)中。
注意:2.0.1版本已经支持ShouldThrow。
答案 0 :(得分:15)
您不需要包含操作。这仅用于单元测试,以验证API是否正在抛出正确的异常。这应该足够了:
[TestMethod]
public void TestThrowFromAsyncMethod()
{
Func<Task> asyncFunction = async () =>
{
await asyncObject.ThrowAsync<ArgumentException>();
};
asyncFunction.ShouldNotThrow();
}
不幸的是,.NET 4.5中缺少Func上的ShoudlNotThrow()。我已经在2.1版(目前是dogfooding)中解决了这个问题。
答案 1 :(得分:1)
如果查看AssertionExtensions.cs class,您会看到Func上的ShouldNotThrow扩展方法仅针对net45或winrt编译目标定义。
检查一下:
此后,我认为您需要调用action方法来执行断言,否则将不会调用内部lambda:
[TestMethod]
public void TestThrowFromAsyncMethod()
{
var asyncObject = new AsyncClass();
Action action = () =>
{
Func<Task> asyncFunction = async () =>
{
await asyncObject.ThrowAsync<ArgumentException>();
};
asyncFunction.ShouldNotThrow();
};
action.ShouldNotThrow();
}