我有一个方法调用,我是单元测试。在该方法内部调用它会调用一个将抛出错误的方法,因为它试图与单元测试运行时不可用的设备对话。有没有办法避免内部方法调用被调用?如何跳过里面的方法调用是在单元测试的方法
环境: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