2011-08-22 64 views
4

我一直在尝试不同的JS单元测试库,但我仍然不知道这样做的正确方法是什么。如何在JavaScript中进行单元测试? (正确的方式)

这个问题有什么共识吗?例如,我试着用QUnit(jQuery使用的单元测试库)编写模式窗口库的一些测试,但它必须在浏览器中运行,并且它不会隐藏效果, m测试或其他令人讨厌的事情(我甚至不知道js中是否可能)。在服务器端语言中,测试套件生成的任何输出都会发送到缓冲区,并在每次测试后丢弃。

如果在js单元测试中不能封装警报,DOM操作和类似的东西,是否正在编写值得用这种语言进行的测试?

+0

您尝试过QUnit以外的其他库吗? –

+0

也许你可以在https://github.com/bebraw/jswiki/wiki/Testing-frameworks找到一些合适的解决方案。有很多框架可供选择。 –

回答

1

如果你真的被DOM改变和其他效果(警告,提示)所困扰,你可以使用模拟和间谍来确保这些改变是有意的。

请参阅Jasmine包含嘲讽和间谍活动的BDD或针对独立库的SinonJS

然后,你可以写这样的(使用兴农)测试:

var mock = sinon.mock(window); 
mock.expects("alert").once().withExactArgs("foo"); 

alert("foo"); 

mock.verify(); 
+0

谢谢,但我不喜欢将测试绑定到特定实现的想法。假设用于调用警报的方法现在不是。我将不得不重新编写测试以删除期望('alert')。无论如何,这是太多的工作。 – HappyDeveloper

+0

是的,这是测试中嘲笑的特殊缺陷。我同意这是相当冗长的。 –

+2

@HappyDeveloper进行单元测试的重点是声明一个行为。如果您从主生产代码中删除了“alert”,并且由于失败而被迫重新编写测试,那么您已经正确编写了测试!这是一件好事!它会通知您对您行为的改变,从而允许您更正代码或测试(取决于哪个是错误的)。这是单元测试和测试驱动开发的重点。 – jamiebarrow

4

测试前端代码(HTML,CSS,JavaScript的)不是一项容易的任务主要是由于需要视觉跨浏览器问题测试例如。确保元素在所有浏览器中正确定位。

为了测试您的JavaScript代码,您需要以“可测试”的方式编写它。我个人发现这篇博客文章非常有帮助:http://www.adequatelygood.com/2010/7/Writing-Testable-JavaScript

至于实际的测试尝试结合QUnit(你已经使用)和http://funcunit.com/。 FuncUnit允许你打开一个html页面并在其dom上运行测试。在家里有一个例子显示它是如何完成的。