在整合測試專案裡要對 HttpClient 執行結果的 Response 內容進行驗證其實有點麻煩... 例如狀態驗證或是要對回傳資料做細部驗證的話,還需要再自己去對 Response Content 做反序列化的處理 也不用寫多一點測試案例才會覺得煩,當你寫了一個測試案例的驗證時就一定會這麼覺得, 當時同事就分享了這麼一個套件「FluentAssertions.Web」來簡化這些回傳內容的驗證。
關於要怎麼做整合測試?整合測試與單元測試的差別?什麼時候要做整合測試?… 網路上有很多相關的資料都可以看看,或者是改天我心血來潮也來寫。
先來看看如果是使用 xUnit 的 Assertions 要怎麼對執行結果的 Response 做驗證
大概是回傳的資料型態不是那麼複雜,所以看起來使用 xUnit Assertions 做驗證並不是那麼繁瑣。
接著看看如果是換成使用 FluentAssertsions 對執行結果的 Response 做驗證
看起來使用 xUnit Assertions 與 FluentAssertions 好像沒有什麼差別,但是我還是習慣於使用 FlentAssertions 口語化的驗證語法,相較於 xUnit Assertions 會更為直覺與順暢。
FluentAssertions.Web
- https://github.com/adrianiftode/FluentAssertions.Web
- https://www.nuget.org/packages/FluentAssertions.Web
- Programming with C# (作者 Adrian Iftode 部落格)
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();
我會建議可以看看範例程式,有提供了哪些的使用方法
- https://github.com/adrianiftode/FluentAssertions.Web/blob/master/samples/Sample.Api.Tests/CommentsControllerTests.cs
- FluentAssertions.Web - Full API
很早以前在寫整合測試案例的驗證部分,會讓我覺得寫得會比較散亂,用基礎的 Assertions 或是 FluentAssertions 做驗證都有同樣的感覺,沒有一致性而且還要另外處理序列化,而同事分享這個套件給我之後,在寫驗證的部分就有比較一致性,然後就沒有那種散亂的感覺,而且在查看測試案例時也比較有可讀性。
而 FluentAssertions 也有提供一個叫做「FluentAssertions.Mvc (for .NET Framework), FluentAssertions.AspNetCore.Mvc (for .NET Core)」的擴充套件
這個套件是給 Controller 類別做單元測試時的驗證套件,無法用在整合測試的。
相反的,FluentAssertions.Web 只能用在整合測試,無法在單元測試裡使用。
以上
純粹是在寫興趣的,用寫程式、寫文章來抒解工作壓力