【问题标题】:Issues with mocking methods using Moq使用 Moq 模拟方法的问题
【发布时间】:2012-11-14 04:43:08
【问题描述】:

我有以下类,它有两个静态方法 Retrieve 和 RetrieveWithQuery。 在此处列出的类下面,我包含了测试的 sn-p。 测试的最后一个断言之外的所有断言都失败并显示以下消息:

失败的 TestMethod2 MoqTest Assert.AreEqual 失败。预期的:。实际:。

我知道问题可能是我在模拟中设置的查询 是与 RetrieveWithQuery 方法中使用的查询不同的实例。 这就是为什么 is 会返回 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));
    }

【问题讨论】:

    标签: unit-testing testing moq


    【解决方案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 页面提供了很好的示例以及更多示例,应该会有所帮助。

    【讨论】:

    • 感谢您的回复,关于您提供的答案,我还有另一个问题。如果要模拟另一个对象级别,我将如何处理?我已经尝试了以下代码,但它失败了。在这种情况下,需要模拟一个请求和查询: mockService.Setup(myServ => myServ.RetrieveRequestMethod( It.Is(r => r.Query == It.Is(q = > q.QueryString == company)))).Returns(expectedContact);
    • 该特定行将变为mockService.Setup(myServ =&gt; myServ.RetrieveRequestMethod( It.Is&lt;MyRequest&gt;(r =&gt; r.Query.QueryString == company)))).Returns(expectedContact);。您应该将匹配约束的主体视为您在手动模拟中编写的相同内容。另外,请查看快速入门页面和 Moq 的其他文档,它们非常好:code.google.com/p/moq/wiki/QuickStart
    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 2011-01-18
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多