我对单元测试相对比较陌生,并且想知道是否有针对以下问题的内置解决方案。c#单元测试覆盖方法
我想测试的方法,其在一个点测量从硬件一些输入。
var results = Measurement.MeasureAll();
我当然要来测试这种没有硬件。有没有办法改写单元测试的范围Measurement.MeasureAll();方法返回一些预定义的值?
我对单元测试相对比较陌生,并且想知道是否有针对以下问题的内置解决方案。c#单元测试覆盖方法
我想测试的方法,其在一个点测量从硬件一些输入。
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
,在你完全控制和mockability /可测试性。然后你可以提供一个模拟版本的包装类(通过使用一个接口而变得微不足道),而不必担心模拟实际的依赖关系。
不幸的是,这是一个静态类(测量),我在这里打电话。让我看看我是否正确理解你。正确的方法是为静态类创建一个包装类MyMeasurement,并将其交给我想要进行单元测试的方法。在单元测试中,我简单地给我的模拟类作为参数,而不是原来的MeasureAll(),不管我希望它做什么? –
@TamaskaJanos:那么在这种情况下,更有理由使用包装器。实例成员比静态成员更容易实现单元测试。包装器可以是基于实例的,并且可以在内部使用依赖关系的静态成员。 – David
让我看看我是否正确理解你。正确的方法是为静态类创建一个包装类MyMeasurement,并将其交给我想要进行单元测试的方法。在单元测试中,我简单地给我的模拟类作为参数,而不是原来的MeasureAll(),不管我希望它做什么? –
您想要将接口编程为不具体的实现。有了这个,你可以很容易地提供你自己的测试实施 – matcheek
这个问题太广泛了。你必须先提供一些代码。基本上你想创建一些接口,可以提供一些虚拟实现来模拟你的硬件。但是,如果您的方法是静态的,则无法做到这一点,您只能模拟虚拟成员。 (当然还有界面成员)。 – HimBromBeere
你也应该看看微软的单元测试框架[Fakes] https://msdn.microsoft.com/en-us/library/hh549175.aspx。如果您没有改变实现的选择,您可以填充MeasureAll方法调用。 – TYY