我感到困惑的單元測試如下:
1. MVC控制器:
[HttpGet]
public async Task<PartialViewResult> DoExternalCallsAsync()
{
var model = new MyModel();
await MyStaticLibrary.DoExternalWorkAsync(Server.MapPath("~\\") + "WorkSource.txt", model);
return PartialView("_MyResults", model);
}
2.靜態庫:
public static async Task DoExternalWorkAsync(string sourcePath, MyModel model)
{
var externalCalls =
System.IO.File.ReadAllLines(sourcePath)
.Where(line => (!string.IsNullOrEmpty(line) && line.First() != '#'))
.Select(p => DoExternalCall(p, model));
await Task.WhenAll(externalCalls);
}
private static async Task DoExternalCall(string urlPath, MyModel model)
{
var result = await GetExternalApiResultAysnc(urlPath);
// some code here...
return;
}
基本上,控制器所做的就是調用一個外部API,它執行一些工作並返回結果或引發錯誤。
還有沒有接口或抽象類與外部Api。
我該如何去做單元測試呢? N. B.我無權改變外部Api的設計。
感謝,
謝謝你的回答。有一次我曾被告知你的設計只能用於你的主要目標。基本上,您不要將您的代碼調整爲「可測試」。靜態庫在那裏,因爲不需要它是靜態的。 另外,如何使用Server.Mappath控制器? – agfc
那是一個廣泛的討論。我認爲你必須改變你的代碼以使其可測試,因爲這些利益是相互衝突的:最「密」或「最小」的代碼通常根本不可測試,而你想測試它。有許多模式可以幫助您使代碼更加可重用和可測試。我個人不喜歡靜態類,特別是當它們包含的方法有副作用時(在這種情況下,調用Web服務,這在測試期間不應該發生)。通常使用靜態類「所以我們不必使用'new'」,這不是使用靜態的藉口。 – CodeCaster
至於'Server.MapPath()',請參見[單元測試Server.MapPath](http://stackoverflow.com/questions/19563106/unit-testing-for-server-mappath)。 – CodeCaster