2016-04-15 90 views
0

我即将构建一个小部件,并且我想使用Jasmine来测试代码,并且我想测试的一件事是changeHtml已被调用。以下是我计划构建小部件的一个粗略示例。我将如何使用茉莉花测试此代码?

var widget = function(userOptions){ 
    var options = userOptions 

    var init = function(){ 
    changeHtml(); 
    }; 

    var changeHtml = function(){ 
    document.getElementById(options.widgetId).innerHTML = 'New and exiting things!'; 
    }; 

    init(); 
}; 

var myWidget = new widget({widgetId: 'widget-div'}); 

现在,由于changeHtml()是私人(正确的短语?)的widget功能,我不能窥探它,看它是否已被称为与否。

我现在唯一能想到的就是让所有东西都成为widget的公共方法,但这看起来并不特别好,因为用户不需要/想要打电话给changeHtml()他们的自我。

这将是什么解决方案?或者,我是否以错误的方式思考这个问题,最好是检查一下div是否已经改变了,而不是被调用的函数?

+1

你的最后一句话总结一下。方法调用是一个实现细节。你想测试结果,它如何到达那里并不重要。 –

回答

2

要么1)测试已经暴露在函数/对象中的最终结果或2)spyOn函数。

要在场景测试最终结果,你需要或者检查HTML值它改变后,或检查,它被称为所以可以将该值设置,如下所示:

describe("widget", function() { 
    it("Should change html", function() { 
     // Arrange 
     spyOn(document, "getElementById").and.callThrough(); 

     // Act 
     var myWidget = new widget({ widgetId: 'widget-div' }); 

     // Assert 
     expect(document.getElementById).toHaveBeenCalled(); 
    }); 
}); 
+0

啊哈,我喜欢这个想法,谢谢:) –