我有一個方法調用,我是單元測試。在該方法內部調用它會調用一個將拋出錯誤的方法,因爲它試圖與單元測試運行時不可用的設備對話。有沒有辦法避免內部方法調用被調用?如何跳過裏面的方法調用是在單元測試的方法
環境:IDE
我有一個方法調用,我是單元測試。在該方法內部調用它會調用一個將拋出錯誤的方法,因爲它試圖與單元測試運行時不可用的設備對話。有沒有辦法避免內部方法調用被調用?如何跳過裏面的方法調用是在單元測試的方法
環境:IDE
在做單元測試,你必須創建嘲笑或存根爲你的所有外部依賴內C#的Visual Studio 2010單元測試。一個可以幫助你的框架是Moq(如果你想探索的話,這裏有很多模擬框架)。
這些模擬或存根(stub)只是提供必要的交互和數據以通過測試的外牆。
如果您提供有關該不可用設備的更多詳細信息,我們可能會提供更多幫助。
有可能是一個更好的辦法,但一次或兩次,我已經在這個情況下一個方法調用另一個複雜的方法,並把一個可選的參數在你測試樣
public void DoSomething(int number, bool skipMethod= false)
{
if(!skipMethod)
MethodThatWillBreak();
{
的方法結束
因此,在運行的正常情況下,它會被罰款,但在你的單元測試,你可以做
DoSomething(2,true);
但實際上,它表明你需要做你的代碼的一些重構,因爲你的單元測試只應該擊中一個「單位」。如果您可以在不調用MethodThatWillBreak
的情況下測試該方法,那麼它首先在那裏做什麼。
語義稍微偏離這裏。應該將callMethod重命名爲跳過方法,就像你寫的那樣。 – Pete
好吧,先生 –
要正確測試單元,您應該從要測試的類中去除與設備的通信。抽象出實現接口的另一個類中的設備部分,將通信類注入到被測對象的ctor中,現在可以從外部注入模擬實現並避免錯誤,mmock實現還可以記錄對其進行的調用或以預定義的方式進行緩解測試。 讀取依賴注入和控制反轉
通常,您將從您正在測試的類中提取外部依賴關係,並在您的單元測試中將它們與假模式交換。我們建議您查看Inversion of Control以及許多Mocking Frameworks(Moq,Rhino Mocks等)中的一個
如果您是單元測試與外部依賴性的一類,則必須使用在注入接口隔離外部的依賴關係
interface IDevice
{
void Run();
}
interface IDeviceOperator
{
void Operate();
}
class DeviceOperator : IDeviceOperator
{
private readonly IDevice _device;
public DeviceOperator(IDevice device)
{
_device = device;
}
public void Operate()
{
_device.Run();
// test other stuff here
}
}
[TestFixture]
public class DeviceOperatorTests
{
[Test]
public void Test_DeviceOperator_Operate()
{
IDevice device = A.Fake<IDevice>(); // Using FakeItEasy 3rd party mocking framework syntax
DeviceOperator deviceOperator = new DeviceOperator(device);
deviceOperator.Operate();
}
}
退房Working Effectively with Legacy Code本書由邁克爾·羽毛 - 它有很多的建議,在處理那些沒有單位代碼測試呢。
在本書可能的方法:在界面
樣品從類派生:
public class WithComplexDependency
{
public void DoSomething()
{
// Extract original code into a virtual protected method
// dependency.MethodThatWillBreak();
CallMethodThatWillBreak();
}
virtual protected void CallMethodThatWillBreak()
{
dependency.MethodThatWillBreak();
}
}
在測試代碼從類派生,並提供自己的實現:
public class WithMockComplexDependency : WithComplexDependency
{
// may also need to add constructor to call original one.
override protected void CallMethodThatWillBreak()
{
// do whatever is needed for your test
}
}
...
WithComplexDependency testObject = new WithMockComplexDependency();
testObject.DoSomething(); // now does not call dependency.MethodThatWillBreak()
...
你可能不希望跳過外部。相反,您想要隔離外部依賴項,例如訪問外部設備。有很多方法可以做到這一點 a。您可以使用第三部分隔離框架,如Moq或RhinoMock等。 b。您可以使用Moles框架(因爲您使用的是VS2010) - 將.NET方法替換爲代表 http://research.microsoft.com/en-us/projects/moles/ c。付費隔離框架,如TypeMock。 d。或者乾脆使用手寫的虛假實現來使用接口,並且您的測試使用假實現。
他試圖單元測試的方法存在依賴性。他需要構建他的代碼,以便他可以通過注入或其他方式解決該依賴關係,如果他計劃使其可測試。 – Pete