1

我正在使用 NUnit 和 Moq 框架进行单元测试。当我尝试使用 mockRepo.Setup(x=>x.GetStr(It.IsAny)()).Returns(str) 模拟 IRepository 时,要测试的方法在 Repository 类中被覆盖并且构建失败。但是,如果我模拟存储库,将要测试的方法设为虚拟,则模拟 IRepository,然后模拟数据并运行测试。

4

1 回答 1

4

任何类型的嘲笑都依赖于成员是可覆盖的。您的模拟框架将创建一些实现您的接口或覆盖您的类的类。所以框架创建的内容类似于以下内容:

class WeirdClassName : IRepository
{
    string GetString(object o) => "SomeString";
}

或者,如果您的成员是班级成员,则:

class WeirdClassName : Repository
{
    string override GetString(object o) => "SomeString";
}

接口成员是隐式可重写的,因为它们实际上不提供任何自己的逻辑。您总是可以为它提供自己的实现。类成员只有在它们是virtual.

在您的情况下,根据您是模拟接口还是类,测试似乎有所不同。这可能表明您的测试取决于类的某些内部结构 - 例如,repo 上的一些初始化。您也应该模拟它,或者将您的测试与该依赖关系分离。

于 2020-09-29T06:52:55.157 回答