我认为截至本文撰写时,Jack是JavaScript最好的模拟框架。主要原因是适用于JavaScript的东西很可能不适用于像Java这样的强类型语言。
许多JavaScript模拟框架受到Java模拟框架的启发(例如优秀的JsMockito)。但这些框架的问题在于它们需要依赖注入,因为这是在Java中使用模拟的唯一合理方式。但是,在JavaScript中,有许多使用模拟的方法,并且您不会被强制在任何地方都使用依赖注入。
例如,对于 JsMockito,您必须制作模拟对象,然后将其传递给您的软件测试对象(SUT)。SUT必须直接调用模拟对象。因此,您被迫将SUT编码为构造函数或以参数形式接收所有依赖项的函数。(有时,这种实现方式是很好的,但并非在每种情况下都是最佳选择。如果您的模拟框架设计强制您的实现方法,则尾巴摇着狗。)
在JavaScript中,很容易“劫持”任何函数。因此,有许多方法可以构建某些东西,以便您可以在不显式注入其依赖项的情况下模拟其部分功能。例如,Jack允许您模拟任何函数,无论它是公共函数还是本地对象上的函数。从那里,您可以对其进行监视、存根或表达期望。关键点在于:一旦您模拟了一个函数,所有对该原始函数的调用将被指向您的模拟对象。换句话说,即使调用了原始未模拟的函数,您的模拟对象仍将被使用。因此,在JavaScript中,您不需要强制依赖注入,尽管在某些情况下可以这样做。
JavaScript是一种与Java(和C#等)不同的语言。它允许使用不同的实现方式。依赖注入在JavaScript中仍然是一个有价值的工具,但不再是唯一的选择。你的模拟框架需要知道并尊重这个事实。Jack以及其他几个人都知道并遵循这个规则,但其中Jack似乎是最成熟且具有丰富特性的。
QUnit
jqUnit
使用QUnit和jqUnit编写JavaScript测试
QUnit是jQuery JavaScript框架的单元测试框架。测试框架本身使用jQuery库,但测试可以针对任何JavaScript编写,并不要求代码使用jQuery。
jqUnit是QUnit的修改版本,它添加了设置、拆卸和断言函数,这些函数更符合xUnit框架的典型特点,并将所有内容封装在一个全局变量中。
测试运行器页面的可视界面很好,允许您深入了解每个测试方法中的每个断言。编写测试非常容易,您可以直接在testRunner页面上运行测试代码[8]。这样可以轻松且可见地进行DOM测试。
QUnit:MIT或GPL(选择) jqUnit:MIT许可证
优点
缺点
我不确定为什么没有人提到 JsTestDriver!它是唯一一个实际按照你在其他语言中使用单元测试工具所期望的方式运作的JavaScript测试工具之一。
无需接触浏览器即可运行测试,可以与 IDE 集成,并可与持续集成系统集成...哦,它很快,可以同时在多个浏览器中运行测试。
您还可以使用其他测试框架,如 YUITest,使其更好。
还可以查看http://sinonjs.org/
它具有测试间谍、测试存根、模拟对象、假定时器、虚假的XMLHttpRequest (XHR)、虚假服务器、沙盒和断言。
它可以与QUnit一起使用,这是一个优点。
http://testdrivenwebsites.com/2010/05/06/java-script-mock-frameworks-comparison
对于Firefox开发,我已经爱上了UXU,它基于MozUnit,但仍然活跃。它具有很好的功能,如模拟服务器和sleep/yield方法。
关于JavaScript的模拟,可以看一下qMock,这是我和同事编写的一个框架,用来补充我们使用QUnit的测试。虽然后者非常适合单元测试,但它并不允许进行非常有效的异步/业务逻辑测试。我们还没有将任何版本标记为稳定版,但那里有一些不错的文档,如果你检出SVN存储库,你会看到qmock本身有单元测试,这些测试相当自解释。
哦,为了将测试自动化作为构建的一部分,我们使用了一个简单的Selenium脚本来浏览我们的测试套件(每个JavaScript文件一个测试页面),并“监听”通过或失败的CSS类(由QUnit添加)。据我所知,这也适用于Internet Explorer和Firefox 2的无头浏览器。