2016-03-04 149 views
2

我对单元测试相对比较陌生,并且想知道是否有针对以下问题的内置解决方案。c#单元测试覆盖方法

我想测试的方法,其在一个点测量从硬件一些输入。

var results = Measurement.MeasureAll(); 

我当然要来测试这种没有硬件。有没有办法改写单元测试的范围Measurement.MeasureAll();方法返回一些预定义的值?

+2

您想要将接口编程为不具体的实现。有了这个,你可以很容易地提供你自己的测试实施 – matcheek

+1

这个问题太广泛了。你必须先提供一些代码。基本上你想创建一些接口,可以提供一些虚拟实现来模拟你的硬件。但是,如果您的方法是静态的,则无法做到这一点,您只能模拟虚拟成员。 (当然还有界面成员)。 – HimBromBeere

+0

你也应该看看微软的单元测试框架[Fakes] https://msdn.microsoft.com/en-us/library/hh549175.aspx。如果您没有改变实现的选择,您可以填充MeasureAll方法调用。 – TYY

回答

3

你会嘲笑依赖。这是你的依赖:

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 /可测试性。然后你可以提供一个模拟版本的包装类(通过使用一个接口而变得微不足道),而不必担心模拟实际的依赖关系。

+0

不幸的是,这是一个静态类(测量),我在这里打电话。让我看看我是否正确理解你。正确的方法是为静态类创建一个包装类MyMeasurement,并将其交给我想要进行单元测试的方法。在单元测试中,我简单地给我的模拟类作为参数,而不是原来的MeasureAll(),不管我希望它做什么? –

+0

@TamaskaJanos:那么在这种情况下,更有理由使用包装器。实例成员比静态成员更容易实现单元测试。包装器可以是基于实例的,并且可以在内部使用依赖关系的静态成员。 – David

+0

让我看看我是否正确理解你。正确的方法是为静态类创建一个包装类MyMeasurement,并将其交给我想要进行单元测试的方法。在单元测试中,我简单地给我的模拟类作为参数,而不是原来的MeasureAll(),不管我希望它做什么? –