2013-05-15 44 views

回答

2

在做单元测试,你必须创建嘲笑或存根为你的所有外部依赖内C#的Visual Studio 2010单元测试。一个可以帮助你的框架是Moq(如果你想探索的话,这里有很多模拟框架)。

这些模拟或存根(stub)只是提供必要的交互和数据以通过测试的外墙。

如果您提供有关该不可用设备的更多详细信息,我们可能会提供更多帮助。

+0

他试图单元测试的方法存在依赖性。他需要构建他的代码,以便他可以通过注入或其他方式解决该依赖关系,如果他计划使其可测试。 – Pete

1

有可能是一个更好的办法,但一次或两次,我已经在这个情况下一个方法调用另一个复杂的方法,并把一个可选的参数在你测试样

public void DoSomething(int number, bool skipMethod= false) 
{ 
    if(!skipMethod) 
     MethodThatWillBreak(); 
{ 
的方法结束

因此,在运行的正常情况下,它会被罚款,但在你的单元测试,你可以做

DoSomething(2,true); 

但实际上,它表明你需要做你的代码的一些重构,因为你的单元测试只应该击中一个“单位”。如果您可以在不调用MethodThatWillBreak的情况下测试该方法,那么它首先在那里做什么。

+1

语义稍微偏离这里。应该将callMethod重命名为跳过方法,就像你写的那样。 – Pete

+0

好吧,先生 –

0

要正确测试单元,您应该从要测试的类中去除与设备的通信。抽象出实现接口的另一个类中的设备部分,将通信类注入到被测对象的ctor中,现在可以从外部注入模拟实现并避免错误,mmock实现还可以记录对其进行的调用或以预定义的方式进行缓解测试。 读取依赖注入和控制反转

0

通常,您将从您正在测试的类中提取外部依赖关系,并在您的单元测试中将它们与假模式交换。我们建议您查看Inversion of Control以及许多Mocking Frameworks(Moq,Rhino Mocks等)中的一个

4

如果您是单元测试与外部依赖性的一类,则必须使用在注入接口隔离外部的依赖关系

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(); 
    } 
} 
1

退房Working Effectively with Legacy Code本书由迈克尔·羽毛 - 它有很多的建议,在处理那些没有单位代码测试呢。

在本书可能的方法:在界面

  • 提取物的依赖 - 理想的方法(见jamespconnor的答案)
  • 使用标志绕过电话(见科尔姆Prunty的答案)
  • 提取物,调入在单元测试中使用的派生类中的虚方法和覆盖
  • 通过代表(可能比全接口/派生更小的影响)

样品从类派生:

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() 
... 
0

你可能不希望跳过外部。相反,您想要隔离外部依赖项,例如访问外部设备。有很多方法可以做到这一点 a。您可以使用第三部分隔离框架,如Moq或RhinoMock等。 b。您可以使用Moles框架(因为您使用的是VS2010) - 将.NET方法替换为代表 http://research.microsoft.com/en-us/projects/moles/ c。付费隔离框架,如TypeMock。 d。或者干脆使用手写的虚假实现来使用接口,并且您的测试使用假实现。

相关问题