为什么模拟存储库需要一个虚拟函数,而模拟IRepository会覆盖现有函数



我正在使用NUnit和Moq框架进行单元测试。当我尝试使用mockRepo模拟IRepository时。Setup(x=>x.GetStr(It.IsAny((((。返回(str(,然后要测试的方法在Repository类中被重写,生成失败。但是,相反,嘲笑IRepository如果我嘲笑Repository将要测试的方法作为虚拟方法,那么数据就会被嘲笑,测试就会运行。

任何类型的嘲讽都依赖于可重写的成员。您的mocking框架将创建一些类,这些类要么实现您的接口,要么覆盖您的类。因此,该框架创建的内容类似于以下内容:

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

或者如果你的会员是班级会员,这个:

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

接口成员是可重写的,因为它们实际上不提供任何自己的逻辑。你可以为它提供自己的实现。只有当类成员是virtual时,它们才是可重写的。

在您的情况下,测试中似乎有一些差异,这取决于您是模拟接口还是模拟类。这可能表明您的测试依赖于类的一些内部结构,例如repo上的一些初始化。您应该同时模拟它,或者将您的测试与该依赖关系解耦。

最新更新