使用FakeItEasy伪造Amazon.DynamoDBv2.DocumentModel.Search失败问题
问题描述
尝试用FakeItEasy创建Amazon.DynamoDBv2.DocumentModel.Search的Fake实例:
var searchFake = A.Fake<Search>();
但始终报错:
Constructor with signature () failed:
No usable default constructor was found on the type Amazon.DynamoDBv2.DocumentModel.Search.
实际上该类型存在无参内部构造函数,可通过以下反射代码创建实例:
var constructor = typeof(Search).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).Single(c => c.GetParameters().Length == 0); var instance = Activator.CreateInstance(typeof(Search), nonPublic: true) as Search;
请问为何FakeItEasy无法实现该操作,或是我哪里操作有误?
原因及解决方法
FakeItEasy默认仅会查找公共构造函数,而你的Search类型无参构造属于内部(非公共)成员,因此默认逻辑下无法被识别。
要让FakeItEasy使用非公共的无参构造,可通过以下两种方式显式配置:
方法一:直接指定目标构造函数
先通过反射获取到内部无参构造,再告诉FakeItEasy使用该构造创建实例:
var constructor = typeof(Search).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance) .Single(c => c.GetParameters().Length == 0); var searchFake = A.Fake<Search>(options => options.WithConstructor(constructor));
方法二:开启非公共构造权限并指定空参数列表
通过配置允许使用非公共构造,同时传入空参数列表匹配无参构造:
var searchFake = A.Fake<Search>(options => options.WithArgumentsForConstructor(new object[0]) .AllowNonPublicConstructors());
两种方式都能让FakeItEasy识别并使用内部无参构造创建Fake实例。
内容的提问来源于stack exchange,提问作者Anton Shakalo
相关产品推荐
相关产品推荐

