CallBase = true在Moq中

时间:2017-12-17 10:54:31

标签: c# moq

你好团队我是moq的新手并且无法理解

的概念
CallBase = true;
var mock = new Mock<IFoo> { CallBase = true };

根据git hub:如果没有期望覆盖成员

,则调用基类实现

但我有以下测试用例,我可以在不使用CallBase = true的情况下模拟基类成员

// Creating Base class.
public abstract class Car
{  
   public virtual bool IsValidSpeed()
    {
        ///complex logic
        ///returnig false just to compile code
        return false;
    }
}

// Creating child class
public class Ferrari : Car
{
    public int Speed { get; set; }
     public void PrintSpeed(int speed)
    {
        if (IsValidSpeed())
        {
            Speed = speed;
        }
    }
}

下面写测试用例。   我没有为我的模拟对象设置属性CallBase = true

 public void MoqPracticeTest2()
 {
    //  var mock = new Mock<Ferrari>() { CallBase = true }; 
    var mock = new Mock<Ferrari>(MockBehavior.Strict);
    //Mocking Base class function
    mock.Setup(x=>x.IsValidSpeed()).Returns(true); 
    //calling function which will call base function
    mock.Object.PrintSpeed(100);
    //calling Verify on mock object
    mock.Verify(x => x.IsValidSpeed(), Times.Once);
    Assert.AreEqual(mock.Object.Speed,100); //Doing Assert
 }

仍然在测试用例之上传递而没有设置回调属性。  有人可以在这里解释一下CallBase = true的用法。

1 个答案:

答案 0 :(得分:2)

您不需要将CallBase设置为true,因为您只需要验证提供的 IsValidSpeed()返回{{1} } {},true对象的速度将是Ferrari方法提供的速度。

通过声明以下内容:

PrintSpeed

您可以模拟此特定方案,而无需详细了解mock.Setup(x=>x.IsValidSpeed()).Returns(true); 的实施方式。

另一方面,试试吧。删除上面的行并将IsValidSpeed设置为true。这次你应该注意断言会失败。这是因为您将调用实际方法并返回CallBase的值,正如您在帖子中已经提到的那样。因此,在这种情况下,提供的速度值不会分配给false