FakeItEasy:在不指定类型的情况下伪造对泛型方法的调用
FakeItEasy: Fake a call to a generic method without specifying the type
我有一个类型依赖于通过通用方法执行查询的外部组件。这是正在播放的内容的简化版本:
public class UnitUnderTest
{
private IQueryEngine _engine;
public UnitUnderTest(IQueryEngine engine)
{
_engine = engine;
}
public OutputType DoSomething()
{
_engine.Query<ExternalType>(...);
_engine.Query<InternalType>(...);
}
}
public interface IQueryEngine
{
IEnumerable<T> Query<T>(string conditions);
}
我正在尝试测试的 DoSomething
方法调用 IQueryEngine
两次。
它第一次使用我可以从测试中访问的类型调用它,所以我使用 A.CallTo
来模拟它没有问题。
但随后它使用我无法访问的类型参数(它是 internal
类型)第二次调用。
现在我的测试失败了,因为 DoSomething
不希望从对 _engine.Query
的调用返回 null,但我无法为 return 构造正确的对象类型。
如何模拟这个调用?
这听起来像是对 InternalsVisibleTo
属性的完美使用。只需将内部类型的实例添加到您的程序集,并将您的测试程序集作为值。
我有一个类型依赖于通过通用方法执行查询的外部组件。这是正在播放的内容的简化版本:
public class UnitUnderTest
{
private IQueryEngine _engine;
public UnitUnderTest(IQueryEngine engine)
{
_engine = engine;
}
public OutputType DoSomething()
{
_engine.Query<ExternalType>(...);
_engine.Query<InternalType>(...);
}
}
public interface IQueryEngine
{
IEnumerable<T> Query<T>(string conditions);
}
我正在尝试测试的 DoSomething
方法调用 IQueryEngine
两次。
它第一次使用我可以从测试中访问的类型调用它,所以我使用 A.CallTo
来模拟它没有问题。
但随后它使用我无法访问的类型参数(它是 internal
类型)第二次调用。
现在我的测试失败了,因为 DoSomething
不希望从对 _engine.Query
的调用返回 null,但我无法为 return 构造正确的对象类型。
如何模拟这个调用?
这听起来像是对 InternalsVisibleTo
属性的完美使用。只需将内部类型的实例添加到您的程序集,并将您的测试程序集作为值。