我有以下类有两个静态方法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));
}
答案 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页面提供了很好的例子以及更多应该有用的内容。