我有一个包含许多通用方法的接口。这些方法根据传入的数据类型执行操作。如何使用NSubstitute进行模拟?目前,我不得不求助于使用具体类而不是模拟,因为我无法处理将调用该方法的所有可能类型。
public interface IInstanceSource
{
bool CanCreate<T>();
T Create<T>();
void Register<T>(Func<T> creator);
}
public static IInstanceSource GetInstanceSource()
{
var _data = new Dictionary<Type, Func<object>>();
var a = Substitute.For<IInstanceSource>();
//code below fails since T is not defined. How do I make the code below accept any type?
a.WhenForAnyArgs(x=>x.Register(Arg.Any<Func<T>>)).Do(x=> { /* todo */});
a.CanCreate<T>().Returns(x => _data[typeof (T)]);
return a;
}
感谢。
答案 0 :(得分:4)
NSubstitute不支持自动设置泛型方法的多个实例。
我们通常在测试中看到IInstanceSource
的方式是为测试中的特定代码配置它,因此T
将是已知的。如果单个夹具需要为几个不同的T
工作,我们可以通过使用ConfigureInstanceSource<T>()
之类的辅助方法来简化配置,这将为特定的T
执行配置步骤。 / p>
在你的情况下,虽然看起来你想要IInstanceSource
的所有虚假实例的固定行为,但在这种情况下,我相信你通过手动编码自己的测试双重来正确处理它。