你好团队我是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
的用法。
答案 0 :(得分:2)
您不需要将CallBase
设置为true
,因为您只需要验证提供的 IsValidSpeed()
返回{{1} } {},true
对象的速度将是Ferrari
方法提供的速度。
通过声明以下内容:
PrintSpeed
您可以模拟此特定方案,而无需详细了解mock.Setup(x=>x.IsValidSpeed()).Returns(true);
的实施方式。
另一方面,试试吧。删除上面的行并将IsValidSpeed
设置为true。这次你应该注意断言会失败。这是因为您将调用实际方法并返回CallBase
的值,正如您在帖子中已经提到的那样。因此,在这种情况下,提供的速度值不会分配给false
。