我是一个对单元测试比较新的人,我想知道是否有一种内置的解决方案来解决以下问题。
我想要测试一个方法,在其中某个时刻需要测量硬件的输入。
var results = Measurement.MeasureAll();
当然,我希望在没有硬件的情况下进行测试。是否有一种方法可以在单元测试的范围内覆盖Measurement.MeasureAll()方法,以返回一些预定义的值?
我是一个对单元测试比较新的人,我想知道是否有一种内置的解决方案来解决以下问题。
我想要测试一个方法,在其中某个时刻需要测量硬件的输入。
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
,情况可能尤为如此。(静态成员使单元测试变得非常困难。)这就是您需要将这样的对象包装在可模拟的包装器中的地方。例如,以下内容就足够简单:public interface IMeasurement
{
SomeType MeasureAll();
}
public class MyMeasurement
{
// declare Measurement here? some other context?
public SomeType MeasureAll()
{
return Measurement.MeasureAll();
}
}
IMeasurement
耦合,您完全控制和模拟/测试。然后,您可以提供包装类的模拟版本(由于使用接口而变得简单),而不必担心模拟实际依赖关系。