我是 Moq 的新手,刚刚观看了 Moqing 上的pluralsight 视频,所以我觉得自己有能力去编写一些测试。我有一个基类,比如说 Sheet,它实现了 ISheet 接口。 Sheet 是页面的基类:
abstract class Sheet: ISheet
{
public virtual void CreateSheet() // Defined in ISheet
{
}
public virtual void BuildSheet() // Defined in ISheet
{
}
//and some abstract methods, etc.
}
public class Page : Sheet
{
public override void CreateSheet()
{
BuildSheet(); // Base class implementation
}
}
我重写了基类中的方法之一CreateSheet()
,但我想测试一下BuildSheet()
从我的派生类调用基类中的方法:
所以在我的测试类中,我 Moq SUT 而不是接口
var MockSheet = new Moq<Page>();
调用方法:
var actual = MockSheet.Object.CreateSheet();
然后验证
MockSheet.Verify(x => x.BuildSheet(), Times.AtLeastOnce);
相反,我得到 MockException“模拟上的预期调用至少一次但从未执行。 CreateSheet 方法永远不会被调用。如果我将 CreateSheet 方法更改为:
public void CreateDocSheet() // removed override
{
BuildSheet() // base classses implementation
}
在测试调用中:
var actual = MockSheet.Object.CreateDocSheet();
有用。我不明白为什么。我相信从功能上讲,这是一种有效的编码方式,我有工作表,有 2 页,我有一个接口,定义了应实现的所有函数和属性,我在基类中实现了这些函数,但不是全部方法需要在派生类中实现,因此,一些方法被重写,一些方法使用基类实现。请解释为什么使用该函数的重写版本会出现问题?