1

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

失败的 TestMethod2 MoqTest Assert.AreEqual 失败。预期的:。实际:<(null)>。

我知道问题可能是我在模拟中设置的查询与 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));
    }
4

1 回答 1

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页面提供了很好的示例以及更多示例,这些示例应该很有帮助。

于 2012-11-14T04:47:54.780 回答