是否可以使用 NSubstitute 模拟本地方法变量?
Is it possible to mock a local method variable using NSubstitute?
例如我有一个带有 Process 方法的 class,在这个方法中我设置了很多东西,例如
public class messageProcessor
{
...
public string Process(string settings)
{
var elementFactory = new ElementFactory();
var strategyToUse = new legacyStrategy();
...
var resources = new messageResource(
elementFactory,
strategyToUse,
...);
}
}
我是否可以创建此 class 的实例,但是当我调用 Process 方法时,替换(例如)elementFactory 以设置为我的模拟工厂。
这可能吗?我该怎么做?谢谢
如果你的代码依赖于ElementFactory
,你可以通过MessageProcessor
class.
的构造函数注入这个class的接口
例如,您创建了一个接口 IElementFactory
,您可以像这样通过构造函数将其注入 class:
public class messageProcessor
{
private readonly IElementFactory elementFactory;
public messageProcessor(IElementFactory elementFactory)
{
this.elementFactory = elementFactory;
}
public string Process(string settings)
{
var strategyToUse = new legacyStrategy();
...
var resources = new messageResource(
this.elementFactory,
strategyToUse,
...);
}
}
现在,在您的测试中,您可以注入 IElementFactory
的替代品。像这样:
public void Test()
{
var elementFactory = Substitute.For<IElementFactory>();
// tell the substitute what it should return when a specific method is called.
elementFactory.AnyMethod().Returns(something);
var processor = new messageProcessor(elementFactory);
}
在运行时,您的应用程序应将 IElementFactory
的实例注入 messageProcessor
class。您应该通过 "Dependency injection" 执行此操作。
例如我有一个带有 Process 方法的 class,在这个方法中我设置了很多东西,例如
public class messageProcessor
{
...
public string Process(string settings)
{
var elementFactory = new ElementFactory();
var strategyToUse = new legacyStrategy();
...
var resources = new messageResource(
elementFactory,
strategyToUse,
...);
}
}
我是否可以创建此 class 的实例,但是当我调用 Process 方法时,替换(例如)elementFactory 以设置为我的模拟工厂。
这可能吗?我该怎么做?谢谢
如果你的代码依赖于ElementFactory
,你可以通过MessageProcessor
class.
例如,您创建了一个接口 IElementFactory
,您可以像这样通过构造函数将其注入 class:
public class messageProcessor
{
private readonly IElementFactory elementFactory;
public messageProcessor(IElementFactory elementFactory)
{
this.elementFactory = elementFactory;
}
public string Process(string settings)
{
var strategyToUse = new legacyStrategy();
...
var resources = new messageResource(
this.elementFactory,
strategyToUse,
...);
}
}
现在,在您的测试中,您可以注入 IElementFactory
的替代品。像这样:
public void Test()
{
var elementFactory = Substitute.For<IElementFactory>();
// tell the substitute what it should return when a specific method is called.
elementFactory.AnyMethod().Returns(something);
var processor = new messageProcessor(elementFactory);
}
在运行时,您的应用程序应将 IElementFactory
的实例注入 messageProcessor
class。您应该通过 "Dependency injection" 执行此操作。