Moq运行替代方法,但未达到方法主体的断点

时间:2019-04-26 08:24:28

标签: c# moq

我嘲笑了一个类并传递了如下参数:

var myClass = new Mock<MyClass>(a.Object, c.Object, b.Object);

这是MyClass

的定义
class MyClass : A
{
    public override void Execute(IDictionary<string, object> parameters)
    {
       ....
    }
}

class A : AbstractClass
{
      public override void Execute()
       {
       }
}

我在单元测试中调用Execute方法:

myClass.Object.Execute();

问题是,它似乎执行了该方法,但没有达到我在Execute的{​​{1}}方法主体内所做的断点。

当我在没有Moq的情况下实例化MyClass并调用MyClass时,它将到达断点。

更新

为进一步说明,我(在提出问题之前)已经尝试使用Execute,但没有用。我知道Mock的理念,也是出于好奇,为什么当它开始时它不起作用!

2 个答案:

答案 0 :(得分:2)

您可以尝试使用:

myClass.Setup(m => m.Execute(It.IsAny<IDictionary<string, object>>())).CallBase();

或者在创建模拟实例时,将此CallBase参数传递给它。

myClass= new Mock<MyClass>(a.Object, c.Object, b.Object) { CallBase = true };

有关更多信息,您可以在自定义模拟行为部分中查看moq wiki。 希望对您有帮助。

UPD。

这是我为测试您的情况而编写的代码。我可以说,它达到了myClass的断点。

public abstract class AbstractClass
{
    public abstract void Execute(IDictionary<string, object> parameters);
}

public class A : AbstractClass
{
    public override void Execute(IDictionary<string, object> parameters)
    {
        int i = 0;
    }
}
public class MyClass : A
{
    public override void Execute(IDictionary<string, object> parameters)
    {
        int i = 0;
        Console.WriteLine(i);
    }
}
public class Tests
{
    [Fact]
    public void TestAbstractClass()
    {
        var myClass = new Mock<MyClass>() {CallBase = true};

        myClass.Object.Execute(new Dictionary<string, object>());
    }
}

答案 1 :(得分:0)

  

我好奇为什么开始时它不起作用

这是由moq设计的。


正如我已经说过的,模拟为每种模拟类型创建代理,仅注意接口,非密封类和abstract \ virtual方法是可以模拟的,因为它只是继承了基类,因此每个调用都基于关于安装行为。因此,如果您模拟该类,则将具有以下内容:

var myClass = new MyClass(); // it is the instance of MyClass
var myClassMock = new Mock<MyClass>(); // it is the instance of MyClassProxy : MyClass

这些类型不同,如果调用myClass.Execute(),则您将清楚地调用实现,但是如果调用myClassMock.Object.Execute(),则将结束于代理类。如果您未进行任何设置,则代理类的默认行为是返回default(T),但是您可以设置其他行为,例如:

  • 在您的情况下,通过设置MyClass来调用基础CallBase
  • 抛出异常,.Setup(...).Throws<TException>()
  • 返回非默认值.Setup(...).Returns(value)