对于异步方法/Func,FluentAssessations ShouldNotThrow无法识别
本文关键字:ShouldNotThrow 识别 FluentAssessations 异步方法 Func | 更新日期: 2023-09-27 18:27:54
我正在尝试检查异步方法抛出的具体异常。
为此,我使用MSTEST和FluentAssertions 2.0.1。
我已经查看了Codeplex上的讨论,并了解它如何与异步异常方法一起工作——这是关于FluentAssessations异步测试的另一个链接:
在尝试使用我的"生产"代码一段时间后,我切换到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.HShouldNotThrow(System.Action,string,params object[])'具有一些无效参数
谢谢。
解决方案
2.0.1 FA版本不支持此ShouldNotThrow
功能,它将包含在下一个版本2.1中(大约下周)。
注意:ShouldThrow在2.0.1版本中已经得到支持。
您不需要包罗万象的Action。这仅在单元测试中用于验证API是否抛出了正确的异常。这应该足够了:
[TestMethod]
public void TestThrowFromAsyncMethod()
{
Func<Task> asyncFunction = async () =>
{
await asyncObject.ThrowAsync<ArgumentException>();
};
asyncFunction.ShouldNotThrow();
}
不幸的是,.NET 4.5中缺少Func上的ShoudlNotThrow()。我已经在2.1版中修复了这个问题(目前是dogfooding)。
如果查看AssertionExtension.cs类,您会发现Func上的ShouldNotThrow扩展方法仅为net45或winrt编译目标定义。
检查此项:
- 您的单元测试项目在.net 4.5或winrt上
- 引用的断言库是.net 4.5的断言库,如果不尝试更改引用了FluentAssertions库
同样在完成此操作后,我认为您需要调用action方法来进行断言,否则将不会调用内部lambda:
[TestMethod]
public void TestThrowFromAsyncMethod()
{
var asyncObject = new AsyncClass();
Action action = () =>
{
Func<Task> asyncFunction = async () =>
{
await asyncObject.ThrowAsync<ArgumentException>();
};
asyncFunction.ShouldNotThrow();
};
action.ShouldNotThrow();
}