要验证模拟,是验证所需的返回

时间:2012-06-08 16:45:39

标签: c# unit-testing mocking moq

我无法让我的验证工作在数据库电话上。

我有一个方法,我只是想验证是否进行了数据库调用。

我无法发布真实的代码,但这是一个很好的例子。

    protected void ReportDB(uint waitTimeInMinutes)
    {
        //check database connection
        Status dbStatus = Status.Ok;
        string dbComment = "ok";
        try
        {
            Data.GetActive("1");
        }
        catch (Exception ex)
        {
            dbComment = "Unable to access the database: " + ex.Message;
            dbStatus = Status.Critical;
        }

        //Report Status.
    }

所以基本上GetActive()方法只是进行数据库调用。如果它没有抛出异常那么我们就很好并且连接性正在上升。

我的测试方法是。

    [TestMethod]
    public void ReportDBStatusTest()
    {
        _fakeData.Setup(s => s.Data.GetActive(It.IsAny<string>()));

        _unitUnderTest = new Service();
        _unitUnderTest.ReportDB(0);

        _fakeData.Verify(s => s.Data.GetActive(It.IsAny<string>()), Times.Once());
    }

我调试通过,调用方法和一切,但验证称它被称为Times.Never。我想我可能只是误解了如何正确地做到这一点。

错误:

模拟一次的预期调用,但是是0次:s =&gt; s.Data.GetActive(It.IsAny()) 配置的设置和调用:

1 个答案:

答案 0 :(得分:5)

预计会出错。这是因为'ReportDB'对象中的'Data'对象与'_fakeData'对象中的'Data'对象不同。

一种解决方法是将“ReportDB”对象中的“Data”对象外部化,以便可以对其进行模拟。否则,您需要更改单元测试。