我在c sharp中使用XUnit和fluentasserations进行单元测试。下面是我获得动态类型的地方,将动态对象转换为该动态类型,并尝试进行断言:
var dynamicType = Type.GetType(...);
dynamic? myObject = JsonSerializer.Deserialize(myJSONData, dynamicType);
myObject!.Products!.Should().NotBeNull();
如果我调试它,myObject确实具有所需的属性和值,但是c sharp和fluentassertion会抛出以下错误:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : 'xxxxx.Products' does not contain a definition for 'Should'
有可能进行比较吗?还是我遗漏了什么?
这是中的一个限制。NET。它不支持dynamic
对象的扩展方法。
一种解决方法是将myObject
强制转换为object
,这样就可以在编译时确定Should
的适当过载。
一些相关问题:
- https://github.com/fluentassertions/fluentassertions/issues/234
- https://github.com/fluentassertions/fluentassertions/issues/473
- https://github.com/fluentassertions/fluentassertions/issues/1493
- https://github.com/fluentassertions/fluentassertions/issues/1738
这是一种简单的方法,如果您的对象是动态的,只需在断言前面添加(对象(强制转换。
(object) myObject!.Products!.Should().NotBeNull();
您需要导入系统。对象