【发布时间】:2016-04-20 01:23:59
【问题描述】:
我是 Moq 的新手,我刚刚观看了 Moqing 上的复数视频,所以我觉得自己有能力去写一些测试。我有一个基类,比如说 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 “Expected Invocation on the mock 至少一次,但从未执行过。 CreateSheet 方法永远不会被调用。如果我将他的 CreateSheet 方法更改为:
public void CreateDocSheet() // removed override
{
BuildSheet() // base classses implementation
}
在测试调用中:
var actual = MockSheet.Object.CreateDocSheet();
它有效。我不明白为什么。我相信从功能上讲这是一种有效的编码方式,我有一张有 2 页的工作表,我有一个接口,它定义了所有应该实现的功能和属性,我在基类中实现了这些功能,但不是全部方法需要在派生类中实现,所以有些方法被覆盖,有些使用基类实现。请解释为什么使用该函数的覆盖版本会出现问题?
【问题讨论】: