[Unit Test] 小技巧-利用 Header 提高 Web API 可測試性

我的作法是在測試專案用OWIN把 WebApp 掛起來,測試案例便可直接打進 Web API,需要外部注入來改變內部狀態時,就不能像以前呼叫 Class,我想到了一些作法,比如組態擋、#if、Header,這裡就分享 Header 的做法

開發環境

直接看代碼

ApiController 會依賴這個方法,當有特定 Header 請求的時候,就聽 Header 的狀態,沒有就用自己的狀態,以下用時間當範例

public static DateTime GetNow(HttpRequestMessage request)
{
    var testNow = request.Headers
                         .FirstOrDefault(=> x.Key == "X-TestNow")
                         .Value?
                         .FirstOrDefault();
    if (string.IsNullOrWhiteSpace(testNow))
    {
        return DateTime.Now;
    }
 
    var decodeNow = Encoding.UTF8.GetString(Convert.FromBase64String(testNow));
    return DateTime.Parse(decodeNow);
}

 

為了方便讓每一個案例套用,我在 HttpClient 生成的時候變注入時間,當然,你也可以依照需求注入你需要的時間

s_webApp = WebApp.Start<Startup>(HOST_ADDRESS);
Console.WriteLine("Web API started!");
HttpClient = new HttpClient();
HttpClient.BaseAddress = new Uri(HOST_ADDRESS);
var base64Now = Convert.ToBase64String(Encoding.UTF8.GetBytes(TestNow.ToString()));
HttpClient.DefaultRequestHeaders.Add("X-TestNow", base64Now)

這樣一來就能注入我想注入的東西了

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo