簡體   English   中英

單元測試靜態實用程序類

[英]Unit testing static utility class

如何在靜態類中單元測試靜態方法?

有這個代碼:

public class AddressConverter {
    public static BillingAddress ConvertAddress(ShippingAddress address)
    {
        var billingAddress = new BillingAddress (); // this is the problem - 3rd party lib
        ...
}

我正在使用第三方庫,我唯一可以修改的是AddressConverter類。 順便說一句,BillingAddress()是第三方庫,反編譯時顯示:

// decompiled code
public class BillingAddress : IOrderAddress
{
     public BillingAddress() : base(SomeSessionContext.Current.Class)
     {
     ...

問題是我無法創建new BillingAddress()因為它的值取自某些會話變量等。

我該怎么測試呢? 任何解決方法?

如果您無法重構以將BillingAddress注入靜態方法,則可以使用Microsoft Fakes來測試它。

基本上你會為你的第三方DLL添加一個Fakes庫:

在“ 解決方案資源管理器”中 ,打開單元測試項目的引用,並選擇包含要偽造方法的程序集的引用。 ...選擇Add Fakes Assembly

在此輸入圖像描述

然后你應該能夠使用ShimBillingAddress (航空代碼警告,我無法訪問您的第三方lib :-))

using (ShimsContext.Create())
{
     // Arrange:
     YourThirdPartyLib.Fakes.ShimBillingAddress.SomeMethod = () => { return "some meaningful value"; };

     // Instantiate the component under test:
     var sut = new AddressConverter();

     // Act:
     var result = sut.ConvertAddress(someShippingAddress);

     // Assert: 
}

MSDN獲取的引用和說明- 使用Microsoft Fakes隔離正在測試的代碼//使用填充程序MSDN 入門 - 使用填充程序將應用程序與其他程序集隔離以進行單元測試

MSDN上有關於fakes生成的填充程序命名約定的信息,因為它並不總是很明顯。

此外, 本答案的后半部分還介紹了如何設置系統dll的假貨。

不要在AddressConverter中創建BillingAddress。 為ConvertAddress使用額外的參數或刪除static關鍵字並使用BillingAddressFactory創建IOrderAddress的新實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM