整合測試 - 使用 FluentAssertions.Web 對 HttpClient 執行結果進行驗證

在整合測試專案裡要對 HttpClient 執行結果的 Response 內容進行驗證其實有點麻煩... 例如狀態驗證或是要對回傳資料做細部驗證的話,還需要再自己去對 Response Content 做反序列化的處理 也不用寫多一點測試案例才會覺得煩,當你寫了一個測試案例的驗證時就一定會這麼覺得, 當時同事就分享了這麼一個套件「FluentAssertions.Web」來簡化這些回傳內容的驗證。

關於要怎麼做整合測試?整合測試與單元測試的差別?什麼時候要做整合測試?…    網路上有很多相關的資料都可以看看,或者是改天我心血來潮也來寫。

先來看看如果是使用 xUnit 的 Assertions 要怎麼對執行結果的 Response 做驗證

大概是回傳的資料型態不是那麼複雜,所以看起來使用 xUnit Assertions 做驗證並不是那麼繁瑣。

接著看看如果是換成使用 FluentAssertsions  對執行結果的 Response 做驗證

看起來使用 xUnit Assertions 與 FluentAssertions 好像沒有什麼差別,但是我還是習慣於使用 FlentAssertions 口語化的驗證語法,相較於 xUnit Assertions 會更為直覺與順暢。

FluentAssertions.Web

FluentAssertions.Web  並不是 FluentAssertions  自己做的套件,而是由 Adrian Iftode 基於 FluentAssertions 所做的 extensions,針對 HttpClient 執行後的 HttpResponseMessage 進行驗證。

將以上兩個分別使用 xUnit Assertions 和 FluentAssertions 進行驗證的測試案例改為使用 FluentAssertions.Web

測試案例的驗證部分改用 FluentAssertions.Web 後,使用套件所提供的 Satify<TModel> 方法就不用額外去做反序列化的處理,然後可以在 Satify<TModel> 方法裡執行對 TModel  做資料驗證。

FluentAssertions.Web 預設使用 System.Text.Json 做反序列化處理,如果要特別處理序列化的大小寫設定,就直接使用 SystemTextJsonSerializeerConfig.Options.PropertyNameCaseInsenstive(預設為 false),xUnit 的話可以寫在測試類別的建構式或是 ClassFixture 或 CollectionFixture 的建構式裡

SystemTextJsonSerializerConfig.Options.PropertyNameCaseInsensitive = true; 

如果你的專案是使用 Newtonsoft.Json (Json.NET) 的話,那個一定要在測試專案裡另外安裝 FluentAssertions.Web.Serializer.NewtonsoftJson 這個 Nuget 套件

然後在建構式透過以下的設定就可以讓 FluentAssertions.Web 能夠正確的執行反序列化

FluentAssertionsWebConfig.Serializer = new NewtonsoftJsonSerializer();

 

我會建議可以看看範例程式,有提供了哪些的使用方法


很早以前在寫整合測試案例的驗證部分,會讓我覺得寫得會比較散亂,用基礎的 Assertions 或是 FluentAssertions 做驗證都有同樣的感覺,沒有一致性而且還要另外處理序列化,而同事分享這個套件給我之後,在寫驗證的部分就有比較一致性,然後就沒有那種散亂的感覺,而且在查看測試案例時也比較有可讀性。

而 FluentAssertions 也有提供一個叫做「FluentAssertions.Mvc  (for .NET Framework), FluentAssertions.AspNetCore.Mvc (for .NET Core)」的擴充套件

這個套件是給 Controller 類別做單元測試時的驗證套件,無法用在整合測試的。

相反的,FluentAssertions.Web 只能用在整合測試,無法在單元測試裡使用。

以上

分享