0

我搜索了该网站和一些文献,但无法得到明确的答案。我正在尝试在构建一个新网页的同时学习单元测试,该网页仅用作白板,您可以在其中添加便利贴。

我有一个代表白板的 Canvas 对象和一个代表便利贴的票证对象。我有(目前)全局函数来检索唯一的画布,我测试如下:

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. 该方法是否总是给我相同的画布?

到目前为止没有问题。但稍后,我正在测试“将票添加到画布”:

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

    canvas.addTicket( ticket );     

    this.assertTrue( canvas.contains( ticket ) );   
};

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

4

2 回答 2

0

严格来说,您应该重写 getCanvas() 以返回预先构造的(即不调用原始构造函数)画布的部分模拟。话虽如此,如果 canvas 的构造函数是一个空函数并且 getCanvas 方法不涉及业务逻辑,那么您应该没有问题。

我会更加警惕最后两个一起使用的语句。canvas.addTicket( ticket );没关系,因为它是正在测试的功能。但是随后您断言您已使用来自同一对象的方法添加了票证。如果这个方法还没有实现,或者返回 false,或者更糟的是 true,该怎么办?如果您的 addTicket 方法具有可以使其将票证添加到列表但更改使contains()抛出异常,还是返回false,还是true?如果 contains 具有某些业务逻辑,它会为您发送它的票证返回 false,但在生产环境中为同一票证返回 true(即您的测试票证尚未正确初始化,缺少状态,已标记为已排除)从环境的业务流程中),如果它现在没有逻辑,但是在项目进行两个月后,逻辑发生了变化,因此您的测试失败但其他一切正常(添加了一个新状态,并且没有此状态的对象被视为不存在,客户 a、b 和 c) 除外。我可以继续。

我的观点是,如果没有代码,我们无法具体回答您的问题,只能为您提供与上述类似的指示和一般性答案。如果您真的不想发布代码,请考虑所有这些场景以及您能想到的所有其他场景,如果在这些场景下以这种方式测试您的代码不会破坏代码,也不会立即测试可预见的未来,那你没事。

于 2013-10-07T13:24:29.100 回答
0

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

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

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

于 2013-10-07T14:30:22.937 回答