CallBase = true 起订量

Abh*_*ngh 6 c# moq

嗨,团队,我是最小起订量的新手,无法理解

CallBase = true;
var mock = new Mock<IFoo> { CallBase = true };
Run Code Online (Sandbox Code Playgroud)

根据 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

下面写测试用例。我没有为我的模拟对象设置属性 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
 }
Run Code Online (Sandbox Code Playgroud)

仍然高于测试用例在没有设置回调属性的情况下通过。有人可以解释一下CallBase = true这里的用法吗?

Chr*_*tos 5

您不需要将 设为CallBasetrue因为您只想验证是否 IsValidSpeed()返回true,对象的速度Ferrari将是提供给该PrintSpeed方法的速度。

因此,通过声明以下内容:

mock.Setup(x=>x.IsValidSpeed()).Returns(true);
Run Code Online (Sandbox Code Playgroud)

您可以模拟这个特定的场景,而无需了解如何实现的细节IsValidSpeed

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