簡體   English   中英

單元測試MVC Controller調用調用外部API的靜態庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM