【问题标题】:Moq - how to initialize testing object once for multiple testsMoq - 如何为多个测试初始化​​一次测试对象
【发布时间】:2023-03-20 09:50:01
【问题描述】:

我正在尝试以这样一种方式构建我的单元测试,即如果我更改正在测试的对象的构造函数,我就不必更改很多测试。这是我现在设置的简化示例:

[TestMethod]
public void Test1()
{
    _mockedObject1.Setup(etc);
    _mockedObject2.Setup(etc);
    var service = new TestedService(_mockedObject1.Object, _mockedObject2.Object, ...,
        _mockedObject7.Object);

    //Act and Assert
}

现在我有 20 个以相同方式排列的单元测试。如果我必须更改 TestedService 的构造函数,我必须进入所有 20 个测试并更改创建服务的行。我可以将这行代码提取到 TestInitialize 或其他东西中,以便我只需要更改一次吗?我的第一个想法是我不能,因为那时服务会在我的 .Setups 之前创建。有没有其他方法可以解决这个问题?

【问题讨论】:

  • 您是否使用 DI 容器,例如 Ninject?

标签: c# unit-testing moq mstest


【解决方案1】:

是的,您可以在设置依赖项之前提取服务的创建。 SetUp 仍将绑定到模拟对象。您可以尝试以下方法:

private TestedService service;

[SetUp]
public void SetUp()
{
    this.service = new TestedService(_mockedObject1.Object, _mockedObject2.Object, ...,
        _mockedObject7.Object);
} 

[TestMethod]
public void Test1()
{
    _mockedObject1.Setup(etc);
    _mockedObject2.Setup(etc);

    //Act and Assert
    this.service.Whatever(...);
}

【讨论】:

    【解决方案2】:

    看看Automoqing,因为您已经在使用 Moq,它会做您想要的,甚至更好。简单来说就是注入模拟的依赖注入容器。

    【讨论】:

      【解决方案3】:

      您可以在函数中使用 [ClassInitialize()] 属性初始化这些对象。这应该在该类中的任何测试运行之前运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 2016-07-13
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多