我對單元測試相對比較陌生,並且想知道是否有針對以下問題的內置解決方案。c#單元測試覆蓋方法
我想測試的方法,其在一個點測量從硬件一些輸入。
var results = Measurement.MeasureAll();
我當然要來測試這種沒有硬件。有沒有辦法改寫單元測試的範圍Measurement.MeasureAll();方法返回一些預定義的值?
我對單元測試相對比較陌生,並且想知道是否有針對以下問題的內置解決方案。c#單元測試覆蓋方法
我想測試的方法,其在一個點測量從硬件一些輸入。
var results = Measurement.MeasureAll();
我當然要來測試這種沒有硬件。有沒有辦法改寫單元測試的範圍Measurement.MeasureAll();方法返回一些預定義的值?
你會嘲笑依賴。這是你的依賴:
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 /可測試性。然後你可以提供一個模擬版本的包裝類(通過使用一個接口而變得微不足道),而不必擔心模擬實際的依賴關係。
不幸的是,這是一個靜態類(測量),我在這裏打電話。讓我看看我是否正確理解你。正確的方法是爲靜態類創建一個包裝類MyMeasurement,並將其交給我想要進行單元測試的方法。在單元測試中,我簡單地給我的模擬類作爲參數,而不是原來的MeasureAll(),不管我希望它做什麼? –
@TamaskaJanos:那麼在這種情況下,更有理由使用包裝器。實例成員比靜態成員更容易實現單元測試。包裝器可以是基於實例的,並且可以在內部使用依賴關係的靜態成員。 – David
讓我看看我是否正確理解你。正確的方法是爲靜態類創建一個包裝類MyMeasurement,並將其交給我想要進行單元測試的方法。在單元測試中,我簡單地給我的模擬類作爲參數,而不是原來的MeasureAll(),不管我希望它做什麼? –
您想要將接口編程爲不具體的實現。有了這個,你可以很容易地提供你自己的測試實施 – matcheek
這個問題太廣泛了。你必須先提供一些代碼。基本上你想創建一些接口,可以提供一些虛擬實現來模擬你的硬件。但是,如果您的方法是靜態的,則無法做到這一點,您只能模擬虛擬成員。 (當然還有界面成員)。 – HimBromBeere
你也應該看看微軟的單元測試框架[Fakes] https://msdn.microsoft.com/en-us/library/hh549175.aspx。如果您沒有改變實現的選擇,您可以填充MeasureAll方法調用。 – TYY