![](/img/trans.png)
[英]Unit testing an AuthorizeAttribute on an ASP.NET Core MVC API controller
[英]Unit testing MVC Controller making calls to a static library calling external API
美好的一天,
我對以下單元測試感到困惑:
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會執行一些工作並返回結果或引發錯誤。
外部Api 沒有接口或抽象類 。
我該如何進行單元測試? 注意:我不能隨意更改外部Api的設計。
謝謝,
在代碼中使用靜態類或方法會使該代碼難以正確進行單元測試。 請參閱“對於單元測試而言,static是否普遍“邪惡””,如果是,為什么reshaper推薦它? , 單元測試中的靜態類/方法/屬性,是否停止 , 何時在C#中使用靜態類 。
使用接口將靜態API調用類包裝為實例類:
public interface IMyLibrary
{
Task DoExternalWorkAsync();
}
public class MyStaticLibrary : IMyLibrary
{
public async Task DoExternalWorkAsync(string sourcePath, MyModel model)
{
return await MyStaticLibrary.DoExternalWorkAsync(sourcePath, model);
}
}
然后,您可以將實例注入控制器的構造函數中 。
因為在此控制器操作方法中應該進行單元測試的唯一原因是:
在測試過程中,您可以在控制器中注入IMyLibrary
並驗證控制器正確調用了該模擬,並且可以驗證結果是否為PartialViewResult
包含其應包含的內容。
該庫是執行某些工作單元的實現細節 。 它應該被完全抽象出來。 如果要運行集成測試 ,則完全是另一種測試風格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.