验证是否使用moq调用抽象方法
本文关键字:调用 抽象方法 moq 是否 验证 | 更新日期: 2023-09-27 18:18:32
我已经用一些抽象方法创建了一个抽象基类:
public abstract class MyBaseClass<T> where T: class, IEntity
{
public T Load(long id)
{
//if in cache continue with cached value
//else make use of protected abstract LoadFromContext
}
protected abstract T LoadFromContext(long id);
}
现在我想检查LoadFromContext是否调用,但我得到一个错误:System。参数异常:成员FakeCacheRepository。LoadFromContext不存在
Unittest Moq Setup,其中FakeCacheRepository是MyBaseClass的派生类型:
Mock<FakeCacheRepository> personRepoMock = new Mock<FakeCacheRepository>();
personRepoMock.Setup(x => x.Load(14)).Returns(new Person() { ID = 14, Name = "Developer14" });
personRepoMock.Protected().Setup("LoadFromContext");
var person = new FakeCacheRepository().Load(14);
Assert.AreEqual("Developer14", person.Name);
personRepoMock.Protected().Verify("LoadFromContext", Times.Once());
我做错了什么,有没有关于moq的好的教程,可以更好地理解,而不必谷歌每个单独的问题。
除了TomDoesCode已经说过的:
要像您那样使用Protected()
,您必须使用通用版本,因为LoadFromContext
返回值(Person
)。此外,您还必须传递参数:
personRepoMock.Protected().Setup<Person>("LoadFromContext", 14L);
同样,您的Verify
必须看起来像
personRepoMock.Protected().Verify<Person>("LoadFromContext", Times.Once(), 14L);
但是即使你改变它,你的测试也不会工作。您创建FakeCacheRepository
的模拟,但随后在FakeCacheRepository
的新实例上调用Load(14)
,而不是在模拟上。
你应该退后一步,想一想你到底想测试什么。如果您想测试FakeCacheRepository
是否从Load
调用LoadFromContext
,那么moq不是适合这项工作的工具。
您设置的模拟对象personRepoMock
似乎没有被FakeCacheRepository
对象person
使用。所以你的setup和verify没有被使用。
然而,我不认为这是测试这个的正确方法,我只是测试FakeCacheRepository
类没有嘲弄。从外部看,FakeCacheRepository
是否继承了MyBaseClass
并不重要,所以只需测试FakeCacheRepository
暴露的方法即可。
如果你想在多个类之间共享代码,将这些代码提取到一个单独的类中——继承不应该用于共享代码。