2016-02-12 119 views
1

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

有了這個代碼:

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()因爲它的值是從一些會話變量等

採取

我該如何測試?任何解決方法?

+0

你通常在哪裏得到'BillingAddress'的實例?它有工廠方法/靜態方法嗎? –

+0

靜態方法。沒有工廠 – ShaneKm

回答

2

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

從本質上講,你還要加上假貨庫您的第三方DLL:

解決方案資源管理器中,打開你的單元測試項目的引用和 選擇參考包含要 方法組裝假貨。 ...選擇添加假貨組裝

enter image description here

那麼你應該能夠使用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 - Isolating Code Under Test with Microsoft Fakes // Getting started with shimsMSDN - Using shims to isolate your application from other assemblies for unit testing拍攝。

MSDN上有關於naming conventions墊片的信息,假貨會產生,因爲它並不總是顯而易見的。

另外,this answer的後半部分爲系統DLL設置了假貨。

1

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

+0

拿出來,不會做任何好事,因爲我無法在我的測試中創建新的BillingAddress()=>這仍然會調用Session stuff – ShaneKm