次のクラスには、Retrieve と RetrieveWithQuery の 2 つの静的メソッドがあります。ここにリストされているクラスの下に、テストのスニペットを含めました。テストの最後のアサート以外はすべて失敗し、次のメッセージが表示されます。
失敗した 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));
}