我是单元测试的新手,我想知道是否存在针对以下问题的内置解决方案。
我想测试一种方法,该方法可以一次测量来自硬件的某些输入。
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
,从而可以完全控制和模拟/可测试。然后,您可以提供包装器类的模拟版本(通过使用接口而变得微不足道),而不必担心模拟实际依赖项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句