c# - 如何模拟在另一个方法中调用的方法?

标签 c# unit-testing moq

我想用一个例子来解释我的问题。

Class A
{
    Fun1()
    {
        // some code
        B obj2 = new B();
        obj2.Fun2();
    }
}

Class B
{
    Fun2() 
    {
        // some code
    }
}

// Test Class for Class A
Class A_Test
{
    Fun1_Test()
    {
        A obj1 = new A();
        A.Fun1();
    }
}

我在这里调用 Fun1,它调用 fun2()。我想模拟调用 fun2()。

我只需要在 Fun1() 中初始化 B 类对象,我不想使用构造函数来完成。

可以模拟调用 fun2() 吗?

最佳答案

你不能,因为 Fun2 是在 Fun1 中创建的对象的实例方法。

由于A依赖于B,所以要将B注入(inject)到A中,如果要实现true隔离。

您还应该“依赖于抽象”,正如依赖倒置原则所宣传的那样。让B实现接口(interface)IB,让A依赖于IB。然后,您模拟接口(interface) IB 并改为注入(inject)该模拟。

class A
{
    public Fun1(IB ib) { ib.Fun2(); }
}

interface IB
{
    Fun2();
}

class B : IB
{
    public Fun2() {}
}

// Test Class for Class A
Class A_Test
{
    Fun1_Test()
    {
        var bMock = new Mock<IB>();
        bMock.Setup(b => b.Fun2());

        A obj1 = new A();
        A.Fun1(bMock.Object);
    }
}

阅读:

  1. Dependency Inversion Principle
  2. Dependency Injection

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

相关文章:

c# - 使用定界符拆分,除非定界符被转义

c# - 使用 linq 按逗号分隔的列值按相关性排序数据表

unit-testing - 如何定义模拟方法被调用零次

java - 如何在 Maven 中使用 junit 运行配置文件特定的测试用例?

c# - 使用最小起订量测试此代码的正确方法是什么?

asp.net-mvc-3 - Mvc3 中的 Moq 包中的 Assert.IsInstanceOfType 失败

c# - Umbraco 后台保存验证

c# - 异步等待执行Windows Phone 8

python - 从单元测试中的结果访问运行时

c# - C# 中的最小起订量和文件/数据保存