Moq:设置一个不返回值的方法

时间:2012-02-07 01:01:00

标签: moq

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

mock.Setup(m => m.Get(param)).Returns(new CustomObject());

但是,当我尝试对没有返回值的存储库调用执行相同类型的安装时,Moq会抛出异常并告诉我这个方法从未被调用过ie在模拟上的调用恰好1次,但是是0次< / p>

准确地说,我这样做:

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

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

在这种情况下我没有正确使用Moq设置吗?是否有一种不同的方法来安装没有返回值的方法?

提前致谢!

2 个答案:

答案 0 :(得分:3)

您无需设置对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;
}

您的测试方法如下:

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());

答案 1 :(得分:0)

尝试使用Verifiable:

mock.Setup(m => m.UpdateRepository(param1)).Verifiable();