Moq在验证时失败异常:模拟上的预期调用至少一次,但从未执行过

时间:2017-06-11 22:52:47

标签: c# unit-testing moq mstest

这是另一个新秀菜鸟问题:

请考虑以下事项:

INNER JOIN

因此,在存储库中,如果它成功创建数据库,则返回TRUE。如果所有SQL UPDATE也成功,则UpdateTable也是如此。然后,我正在做的就是将结果传递回ViewModel以表明一切顺利。

所以在我的MSTest中:

    public class Company
{
    public string CompanyName {get; set; }
    public string Address {get; set; }
}

public interface IRepository
{
    bool CreateDatabase(string name);
    bool UpdateTable(Company _co);
}

public class MyService
{
    private IRepository _repo;

    public MyService(IRepository repo)
    {
        _repo = repo;
    }

    public bool Commit(string database_name, Company co)
    {
        if (_repo.CreateDatabase(database_name))
            return _repo.Commit(co);

        return false;
    }
}

这是事情变得如此糟糕的地方。结果返回true,这意味着它返回了正确的结果,但是Moq验证失败了,我得到了这个例外:

  

模拟上的预期调用至少一次,但从未执行过:r => r.CreateDatabase( “测试”)

为什么?即使我删除了Times.Once并且只有 [TestMethod] public void Test_If_Calls_CreateDatabase_And_UpdateTable() { var name = "test"; var repoMock = new Mock<IRepository>(); var _company = new Company(); repoMock.Setup(r => r.CreateDatabase(It.IsAny<string>())).Returns(true); repoMock.Setup(r => r.UpdateCompanyTable(It.IsAny<Company>())).Returns(true); var engine = new MyService(repoMock.Object); var result = engine.Commit(name, _company); Assert.IsTrue(result); // PASSES repoMock.Verify(r => r.CreateDatabase(name), Times.Once); //FAILS repoMock.Verify(r => r.UpdateCompanyTable(_company), Times.Once); //FAILS } ,我仍然会收到相同的失败错误消息。

有什么建议吗?

更正

代码确实是第一个建议的答案。但是有一些复制和粘贴错误悄悄进入,这是因为我正在尝试一些变化来使单元测试工作。例如,我尝试过这些变化:

repoMock.Verify(r => CreateDatabase(name))

我原本以为第一行会像有人建议的那样工作,但事实并非如此,因此我在这里寻求一些帮助。

1 个答案:

答案 0 :(得分:2)

实际上,正是Chetan Ranpariya在评论中提出了答案,我希望他会发布一个建议的答案,而不是我,所以我可以给他信用。

因为我正在使用It.IsAny<string>()It.IsAny<Company>(),所以在尝试验证方法确实运行一次时,我需要拥有SAME签名。因此,为了测试它,应该是这样的:

    repoMock.Verify(r => r.CreateDatabase(It.IsAny<string>()), Times.Once); 
    repoMock.Verify(r => r.UpdateCompanyTable(It.IsAny<Company>()), Times.Once);

现在测试通过了。

谢谢Chetan!