使用Moq模拟方法的问题

时间:2012-11-14 04:43:09

标签: unit-testing testing moq

我有以下类有两个静态方法Retrieve和RetrieveWithQuery。 在这里列出的类下面,我已经包含了一个测试片段。 除测试的最后一个断言之外的所有断言都失败,并显示以下消息:

TestMethod2失败MoqTest Assert.AreEqual失败。预期:。实际:其中(空)取代。

我理解问题可能是我在mock中设置的查询 是与RetrieveWithQuery方法中使用的查询不同的实例。 这就是为什么会返回null。

在一个完美的世界里,我会简单地重新考虑服务类,不幸的是我 使用已经生产的遗留代码。目标是先完成 测试,然后重新生成代码并运行回归测试,然后再更新生产 环境。

是否有解决方法或不同的方法来测试它?

public class MyService  
{
    public virtual string RetrieveMethod(string account)
    {
        if (account == "The abc company")
        {
            return "Peter Smith";
        }

            return "John Doe";
    }

    public virtual string RetrieveMethod(MyQuery query)
    {
        return RetrieveMethod(query.QueryString);   
    }

    public static string Retrieve(MyService service, string value)
    {
        return service.RetrieveMethod(value);
    }

    public static string RetrieveWithQuery(MyService service, string value)
    {
        var query = new MyQuery
        {
            QueryString = value
        };

        return service.RetrieveMethod(query);
    }

}

public class MyQuery
{
    public string QueryString;
}



    [TestMethod]
    public void TestMethod2()
    {
        var mockService = new Mock<MyService>();

        const string company = "The abc company";
        const string expectedContact = "Peter Smith";

        var queryAccount = new MyQuery
                        {
                            QueryString = company
                        };

        // Setup base retrieve
        mockService.Setup(myServ => myServ.RetrieveMethod(company)).Returns(expectedContact);

        // Setup base retrieve with query
        mockService.Setup(myServ => myServ.RetrieveMethod(queryAccount)).Returns(expectedContact);

        // test base retrieve with query - PASS
        Assert.AreEqual(expectedContact, mockService.Object.RetrieveMethod(queryAccount));

        // test static method retrieve - PASS
        Assert.AreEqual(expectedContact, MyService.Retrieve(mockService.Object, company));

        // test static method retrieve with query - FAIL
        Assert.AreEqual(expectedContact, MyService.RetrieveWithQuery(mockService.Object, company));
    }

1 个答案:

答案 0 :(得分:1)

尝试使用此设置:

    // Setup base retrieve with query
    mockService.Setup(myServ => myServ.RetrieveMethod(It.Is<Query>(q=>q.QueryString == queryAccount.QueryString)).Returns(expectedContact);

或者您可以在Equals for Query上重载,以便创建的Query等于expectedQuery。

Moq QuickStart页面提供了很好的例子以及更多应该有用的内容。