单元测试依赖测试

时间:2013-10-06 14:56:52

标签: javascript unit-testing testing tdd

我搜索了网站和一些文献,但无法得到明确的答案。我正在尝试学习单元测试,同时构建一个新的网页,它只是作为白板,你可以添加post-it。

我有一个代表白板的Canvas对象,以及一个代表post-it的票对象。我有(现在)全局函数来检索唯一的画布,我测试如下:

this.testRetrieveCanvas = function()
{
    var canvas = getCanvas();

    this.assertTrue( canvas != null );
}

this.testCanvasType = function()
{
    var canvas = getCanvas();

    this.assertTrue( canvas instanceof Canvas );    
}

this.testIfCanvasIsReused = function()
{
    var canvas = getCanvas();

    this.assertEquals( canvas, getCanvas() );       
}

所以,我测试了三件事:

  1. 该方法是否返回画布?
  2. 这是一个真实的画布吗?
  3. 该方法总是给我相同的画布吗?
  4. 到目前为止没有问题。但是稍后,我正在测试“将票证添加到画布”:

        this.testAddTicketToCanvas = function()
    {
        var ticket = factory.createTicket("yellow");
        var canvas = getCanvas();
    
        canvas.addTicket( ticket );     
    
        this.assertTrue( canvas.contains( ticket ) );   
    };
    

    如您所见,我在我的测试中使用了getCanvas()函数。这是一个依赖测试吗?我的意思是,前三个测试必须通过,如果我希望这个测试能够毫无疑问地运行。如果它是依赖的,我将如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

严格地说,你应该覆盖getCanvas()来返回一个预构造的(即原始构造函数不被调用)canvas的部分模拟。话虽如此,如果canvas的构造函数是一个空函数而且getCanvas方法没有涉及业务逻辑,那么你应该没有问题。

我会更加警惕最后两个一起使用的陈述。 canvas.addTicket( ticket );没问题,因为它是被测试的功能。但是你断言你已经使用同一个对象的方法添加了故障单。如果此方法尚未实现,或返回false,或更糟,该怎么办?如果您的addTicket方法具有辅助效果,可以使它将票证添加到列表但更改使contains()抛出异常,或返回false或true的标志,该怎么办?如果包含某些业务逻辑会使其为您发送的票证返回false,但对于生产环境中的相同票证是正确的(即您的测试票证未正确初始化,缺少状态,已标记为已排除)从环境的业务流程来看,如果现在没有逻辑,但是在项目进行两个月之后,逻辑会发生变化,以便您的测试失败但其他所有工作都会正常工作(添加新状态,没有此状态的对象被视为不存在,客户a,b和c除外。我可以继续。

我的观点是没有我们无法专门回答你的问题的代码,只给你指针和上面的一般答案。如果你真的不想发布代码,那么考虑所有这些场景,以及你能想到的所有其他场景,如果在这些情况下测试你的代码,这种方式不会破坏代码,也不会破坏现在和在可预见的未来,那你没事。

答案 1 :(得分:0)

对你的问题的简短回答是,不。 如果您的代码没有违反任何单元测试 只要你遵守这些rules原则。

通常,对于那些问题,有关于模拟测试的某些部分的大量讨论,例如你的getCanvas()函数。我同意这个讨论背后有理由,如果你想继续进行测试或TDD,你应该深入研究这个主题。 (请参阅Martin Fowler的这篇优秀article)。

但是,对于这是否是有效单元测试的问题,我认为只要您遵守单元测试规则就不相关。