使用Moq模拟通用存储库

时间:2014-07-18 01:42:22

标签: c# testing mocking moq

我正在使用Moq并尝试模拟实现IGenericRepository接口的IDummyRepository,并且需要验证对IGenericRepository的Add方法的调用。但是下面的示例代码我得到了一个MockException。

如果我将ServiceDummy中的IGenericRepository替换为IDummyRepository,则测试有效,但不是我需要的方式。

这如何运作?

[TestClass]
public class DummyServiceSpec
{
    protected DummyService service;
    protected DummyModel model;

    [TestClass]
    public class Work : DummyServiceSpec
    {
        [TestMethod]
        public void ExpectToWork()
        {
            var repositoryMock = new Mock<IDummyRepository>();
            var serviceDummy = new ServiceDummy(repositoryMock.Object);
            var entity = new Dummy { DummyString = "DummyString" };

            serviceDummy.Add(entity);

            repositoryMock.Verify(r => r.Add(It.IsAny<Dummy>()), Times.AtLeastOnce());
        }
    }
}

public class ServiceDummy
{
    protected IGenericRepository<Guid, Dummy> dummyRepository;

    public ServiceDummy(IDummyRepository dummyRepository)
    {
        this.dummyRepository = dummyRepository;
    }

    public virtual void Add(Dummy entity)
    {
        this.dummyRepository.Add(entity);
    }
}

2 个答案:

答案 0 :(得分:1)

尝试将存储库期望代码移动到存储库的Moq设置中。由于Add()方法是一个void,因此没有结果可以检查,但你可以使它可以验证它是否实际被调用。

[TestMethod]
public void ExpectToWork()
{
    var repositoryMock = new Mock<IDummyRepository>();
    var serviceDummy = new ServiceDummy(repositoryMock.Object);
    var entity = new Dummy { DummyString = "DummyString" };

    repositoryMock.Setup(i => i.Add(It.IsAny<Dummy>())).Verifiable();

    serviceDummy.Add(entity);
    repositoryMock.Verify();
 }

答案 1 :(得分:0)

抱歉,我刚发现问题,这是我的GenericRepository代码中的一个错误。