2016-03-04 147 views
2

我對單元測試相對比較陌生,並且想知道是否有針對以下問題的內置解決方案。c#單元測試覆蓋方法

我想測試的方法,其在一個點測量從硬件一些輸入。

var results = Measurement.MeasureAll(); 

我當然要來測試這種沒有硬件。有沒有辦法改寫單元測試的範圍Measurement.MeasureAll();方法返回一些預定義的值?

+2

您想要將接口編程爲不具體的實現。有了這個,你可以很容易地提供你自己的測試實施 – matcheek

+1

這個問題太廣泛了。你必須先提供一些代碼。基本上你想創建一些接口,可以提供一些虛擬實現來模擬你的硬件。但是,如果您的方法是靜態的,則無法做到這一點,您只能模擬虛擬成員。 (當然還有界面成員)。 – HimBromBeere

+0

你也應該看看微軟的單元測試框架[Fakes] https://msdn.microsoft.com/en-us/library/hh549175.aspx。如果您沒有改變實現的選擇,您可以填充MeasureAll方法調用。 – TYY

回答

3

你會嘲笑依賴。這是你的依賴:

Measurement 

什麼是Measurement?它從何而來?爲了使代碼單元可測試,應該提供Measurement該代碼。事情是這樣的:

public void MethodBeingTested(Measurement measurement) 
{ 
    // use Measurement here 
} 

或者,也許這樣的:

public class SomeClass 
{ 
    private Measurement TheMeasurement { get; set; } 

    public SomeClass(Measurement theMeasurement) 
    { 
     TheMeasurement = theMeasurement; 
    } 

    public void MethodBeingTested() 
    { 
     // use TheMeasurement here 
    } 
} 

然後你的單元測試可以創建一個假的/模擬/存根/等。 Measurement並將其提供給測試。 (這裏有大量的嘲諷圖書館可以提供幫助,我個人喜歡Moq和RhinoMocks。)這個「模擬」版本將被測試定義爲以特定的和可預測的方式執行。然後它會觀察到正在測試的代碼與預期的方式完全相互作用。


現在,一些對象是非常難以嘲笑的。 這可以尤其是如果你給我們的是static(靜態成員使單元測試非常困難的。)這是你會在一個mockable包裝,其可以被模擬包裹這樣的對象。事情如此簡單:

public interface IMeasurement 
{ 
    SomeType MeasureAll(); 
} 

public class MyMeasurement 
{ 
    // declare Measurement here? some other context? 

    public SomeType MeasureAll() 
    { 
     return Measurement.MeasureAll(); 
    } 
} 

這裏的想法是,你的業務邏輯將耦合到IMeasurement,在你完全控制和mockability /可測試性。然後你可以提供一個模擬版本的包裝類(通過使用一個接口而變得微不足道),而不必擔心模擬實際的依賴關係。

+0

不幸的是,這是一個靜態類(測量),我在這裏打電話。讓我看看我是否正確理解你。正確的方法是爲靜態類創建一個包裝類MyMeasurement,並將其交給我想要進行單元測試的方法。在單元測試中,我簡單地給我的模擬類作爲參數,而不是原來的MeasureAll(),不管我希望它做什麼? –

+0

@TamaskaJanos:那麼在這種情況下,更有理由使用包裝器。實例成員比靜態成員更容易實現單元測試。包裝器可以是基於實例的,並且可以在內部使用依賴關係的靜態成員。 – David

+0

讓我看看我是否正確理解你。正確的方法是爲靜態類創建一個包裝類MyMeasurement,並將其交給我想要進行單元測試的方法。在單元測試中,我簡單地給我的模擬類作爲參數,而不是原來的MeasureAll(),不管我希望它做什麼? –