gpt4 book ai didi

unit-testing - 使用 Moq 模拟方法的问题

转载 作者:行者123 更新时间:2023-11-28 20:45:21 26 4
gpt4 key购买 nike

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

失败的 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));
}

最佳答案

为您的设置尝试这个:

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

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

Moq QuickStart页面有这方面的很好的例子以及更多应该有很大帮助的例子。

关于unit-testing - 使用 Moq 模拟方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com