gpt4 book ai didi

c# - 如何强制方法使用模拟?

转载 作者:太空狗 更新时间:2023-10-30 01:35:03 26 4
gpt4 key购买 nike

我的应用程序由各种具体的 Job 类组成(全部继承自抽象 Job 类)。在他们的 Run() 方法中,他们通常调用外部服务。我想测试我的工作类并模拟服务结果。

这是一个典型的具体 Run() 方法的样子:

    InstallWpJobResult result = new InstallWpJobResult();
WpManager wpManager = new WpManager();
if (!WpManager.InstallWp(Domain, SiteTitle, WpUsername, WpPassword, WpEmail))
result.Error = "Error installing WordPress";
return result;

我希望 WpManager.InstallWp 返回 true(在模拟版本中)。我知道如何模拟对象和方法,但如何让我的工作使用模拟版本? (现在它在方法本身中创建了一个实例)。

顺便说一句,我正在使用 Moq 框架进行模拟。

最佳答案

几个选项:

  1. 定义一个工厂服务 IWpManagerFactory,它被注入(inject)到您的作业类中,并使用一种方法来构造您的模拟 WpManager。
  2. 在您的作业中定义一个虚拟方法 BuildWpManager 并在您的测试中覆盖该方法以注入(inject)您的模拟。

工厂服务方法的快速示例:

public interface IWpManagerFactory
{
WpManager BuildWpManager();
}

public sealed class Tests
{
public void Test()
{
var manager = new Mock<WpManager>();
//Set up mock manager here...

var factory = new Mock<IWpManagerFactory>();
factory.Setup(f => f.BuildWpManager()).Returns(manager.Object);

//Inject factory to class under test and execute the method under test...
}
}

这当然假设您的 WpManager 具有可以模拟的虚拟方法。如果没有,您还需要提取一个 IWpManager 接口(interface),然后模拟它。

关于c# - 如何强制方法使用模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27512173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com