验证是否使用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的好的教程,可以更好地理解,而不必谷歌每个单独的问题。

验证是否使用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暴露的方法即可。

如果你想在多个类之间共享代码,将这些代码提取到一个单独的类中——继承不应该用于共享代码。