天天看點

使用Microsoft Fakes 進行測試

Microsoft Fakes 可以提供成員模拟的方法.以友善進行單元測試

如果不使用模拟方法我們要關心很多東西,如資料庫的資料變化,接口調用導緻的變化,檔案、及其它資源的通路等問題。

使用模拟我們則可以隻關系我們需要測試的那部分邏輯。

使用Microsoft Fakes 進行測試

Microsoft Fakes 提供了兩種模拟類型成員的方式.以下兩種方式的替代實作,都可以由委托來重新實作.

1.Stub Type,存根類型,可以動态地為接口及非密封的virtual或屬性附加委托,以重新定義其實作,生成的類為強類型.

2.Shim Types,填充類型,解決了密封類或static成員的問題,T的填充類型ShimT可以為T的每個成員提供一個替代實作

由于Stub和Shim的實作方式不同,是以它們也有不同的要求,下面總結了選擇它們的一些原則:

性能方面:運作時使用Shim重寫會影響性能,Stub由于使用的是虛方法,則無此問題

對static方法/sealed類型:Stub類型隻可以重寫虛方法,是以,它不适用于static方法/sealed方法/sealed類中的方法,等

Internal類型:對于标記了InternalsVisibleToAttribute的内部類型,Fakes也可以起作用

private方法:如果private方法的簽名上的所有類型都是可見類型,那麼可以通過Shim來替換實作.Stub隻能替換可見方法.

接口和抽象方法:Stub可以提供接口或抽象方法的替代實作.Shim則不能,因為沒有實際的方法體.

是以建議在一般情況下使用Stub來支援那些可測試性做的非常好的類型,而用Shim來解決那些耦合很大,可測試性很差的代碼或三方元件.

假設我們在項目ClassLibrary1中有以下幾個類

我們要使用Fakes進行測試隻需要在測試項目中引用 ClassLibrary1,并且在之上右鍵->建立 Fakes即可使用Fakes

之後我們就可以使用類似以下代碼來模拟一個IDataAccess的執行個體 ,MyClass.GetMyData  這個static方法的實作

前者即使用Stub,後者即Shim

Stub 與其它Mock差不多,隻是使用委托來改變方法實作

而Shim則需要建立 ShimsContext的作用域

注意:暫時發現Shim測試在Resharper UnitTest Session運作異常,使用VS則無問題