1
我有以下類有兩個靜態方法Retrieve和RetrieveWithQuery。 在這裏列出的類下面,我已經包含了一個測試的片段。 除測試的最後一個斷言外,所有測試都失敗,並顯示以下消息:使用Moq嘲笑方法的問題
失敗TestMethod2 MoqTest Assert.AreEqual失敗。預期:。實際:<(null)>。
我知道問題可能是我在模擬 中設置的查詢是與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));
}
感謝您的回覆,我對您提供的答案有另一個問題。如果有另一個對象級別模擬,我將如何去解決這個問題?我試過下面的代碼,它失敗了。 在這種情況下有一個請求和查詢需要被嘲笑: \t \t mockService.Setup(myServ => myServ.RetrieveRequestMethod( It.Is(R => r.Query == It.Is (q => q.QueryString == company))))。returns(expectedContact); –
noobie
該特定行將變成'mockService.Setup(myServ => myServ.RetrieveRequestMethod(它是(r => r.Query.QueryString == company))))。返回(expectedContact);'。你應該將匹配約束的主體看作是你在手動模擬中寫的相同的東西。另外,請查看Moq的快速入門頁面和其他文檔,它們非常好:http://code.google.com/p/moq/wiki/QuickStart。 –
tallseth