2012-09-07 20 views
2

說我有以下代碼:如何嘲諷方法,調用在C#中使用moq.mock靜態類

public class NumberClass 
{ 
    public NumberClass() 
    { 
     DefaultNumber = 1; 
    } 
    public int DefaultNumber{set;get;} 
} 

public static class NumberSetup 
{ 
    public static NumberClass GetDefaultNumber() 
    { 
     return new NumberClass(); 
    } 
} 

public class NumberSetupImplementation 
{ 
    int FinalNumber; 
    public void IncreaseNumber(int currentNumber) 
    { 
     FinalNumber = currentNumber + NumberSetup.GetDefaultNumber().DefaultNumber; 
    } 
} 

我想在C#.NET使用moq.mock測試方法NumberSetupImplementation.IncreaseNumber,這個問題我面對的是該方法是調用靜態方法。

我已閱讀this,但我不知道如何實現它在我的情況

回答

1

你必須適當地設計你的代碼中使用Moqs的好處。

通常這意味着廣泛的IoC和清晰的應用程序層。 Moq存在的主要原因是排除深度依賴關係,因此您可以專注於測試獨立於上下文創建的內容。有或沒有Moq,這是真的,它使它更容易一些。

1

Moq在引擎蓋下使用動態代理,這就是爲什麼你不能使用Moq來模擬靜態方法。爲了設計可測試性,其中一點是避免使用靜態方法。對於你的例子,你可以使用DI來注入NumberSetup或者另一個技巧是使用兩個構造函數:

public interface INumberSetup 
{ 
    NumberClass GetDefaultNumber(); 
} 

public class NumberSetup: INumberSetup 
{ 
    public NumberClass GetDefaultNumber() 
    { 
     return new NumberClass(); 
    } 
} 

public class NumberSetupImplementation 
{ 
    private int _finalNumber; 
    private INumberSetup _numberSetup; 

    public NumberSetupImplementation() 
     : this(new NumberSetup()) 
    {} 

    public NumberSetupImplementation(INumberSetup numberSetup) 
    { 
     _numberSetup = numberSetup; 
    } 

    public void IncreaseNumber(int currentNumber) 
    { 
     _finalNumber = currentNumber + _numberSetup.GetDefaultNumber().DefaultNumber; 
    } 
}