文章目錄
如何 Mock System.Web.Hosting.HostingEnvironment.MapPath 虛擬路徑
同事想要為負責的專案加上測試保護,讓之後的修改可以降低風險,但很快地就遇上問題:專案在開發階段時並沒有加上任何測試,專案的部份語法是相對較難測試的,同事遇到的問題就是其一:特定方法使用了 System.Web.Hosting.HostingEnvironment.MapPath
去讀取檔案內容。
使用 fakes
加入 Fakes assembly
- 開啟測試專案的 References 資料夾
System.Web.Http
上按右鍵 –> Add Fakes Assembly
專案加入 dll 與 config
References 資料夾多了
System.Web.Http.{版本}.Fakes
dllFakes 資料夾已產生
System.Web.Http.fakes
的設定檔References 資料夾則沒有出現對應版本的
System.Web.Http.{版本}.Fakes
dll 請參考這篇 Fake Assembly 無法自動產生 *.Fakes dll 及出現 build fail
程式碼 mock
create ShimsContext
namespace
Microsoft.QualityTools.Testing.Fakes
using Microsoft.QualityTools.Testing.Fakes;
ShimsContext Create
using (ShimsContext.Create()) { }
指定
HostingEnvironment.MapPath
ShimHostingEnvironment.MapPathString = (s => @"D:\yowkoTest\App_Data");
完整程式碼
api
public class HomeController : Controller { [HttpGet] public string MapPath() { return HostingEnvironment.MapPath("~/App_Data"); } }
test
using (ShimsContext.Create()) { string path = @"D:\yowkoTest\App_Data"; ShimHostingEnvironment.MapPathString = (s => path); HomeController controller = new HomeController(); var actual= controller.MapPath(); Assert.AreEqual(path,actual); }
參考資料
文章作者 Yowko Tsai
上次更新 2021-11-02
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。