Moq:设置不返回值的方法

Tee*_*Zee 4 moq

我正在尝试模拟对存储库的调用。当存储库调用使用 Setup().Returns 返回值时,我可以成功执行此操作:

mock.Setup(m => m.Get(param)).Returns(new CustomObject());
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试对不返回任何值的存储库调用执行相同类型的设置时,Moq 会抛出异常并告诉我此方法从未在模拟上调用 ieExpected 调用 1 次,而是 0 次

准确地说,我正在这样做:

mock.Setup(m => m.UpdateRepository(param1)); // UpdateRepository returns no value
service.DoUpdate(param1);
mock.Verify(m => m.UpdateRepository(param1), Times.Exactly(1));
Run Code Online (Sandbox Code Playgroud)

注意:DoUpdate方法仅调用repository.UpdateRepository(param1);

在这种情况下,我是否没有正确使用起订量设置?是否有其他不返回值的安装方法?

提前致谢!

Tru*_*ill 7

您不需要设置对 UpdateRepository 的调用。只要验证一下就可以了。

鉴于这些类型:

public interface IRepository
{
   void UpdateRepository(string value);
}

public class Service
{
    public Service(IRepository repository)
    {
        _repository = repository;
    }

    public void DoUpdate(string value)
    {
        _repository.UpdateRepository(value);
    }

    private IRepository _repository;
}
Run Code Online (Sandbox Code Playgroud)

您的测试方法可能如下:

const string param1 = "whatever";

var repoMock = new Mock<IRepository>();

var sut = new Service(repoMock.Object);

sut.DoUpdate(param1);

repoMock.Verify(x => x.UpdateRepository(param1), Times.Once());
Run Code Online (Sandbox Code Playgroud)