Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单元测试中的重置模块_Javascript_Unit Testing_Requirejs_Qunit - Fatal编程技术网

Javascript 单元测试中的重置模块

Javascript 单元测试中的重置模块,javascript,unit-testing,requirejs,qunit,Javascript,Unit Testing,Requirejs,Qunit,我使用以下模式创建了一个requirejs模块: // foo.js define(function(){ var x = 0; function doStuff(){ return ++x; } return { doStuff: doStuff }; }); 还有一个QUnit测试,看起来像这样: // testfoo.js define(['QUnit, foo'], function(QUnit, foo){ funct

我使用以下模式创建了一个requirejs模块:

// foo.js
define(function(){

    var x = 0;

    function doStuff(){
        return ++x;
    }

    return { doStuff: doStuff };

});
还有一个QUnit测试,看起来像这样:

// testfoo.js
define(['QUnit, foo'], function(QUnit, foo){

    function setup(){
        //...?
    }        

    function teardown(){
       //...?
    }

    function runTests(){

         QUnit.test('foo counter remains at 1 on multiple tests', function(assert){
              assert.equal(foo.doStuff(), 1); // this will work
         });

         QUnit.test('foo counter remains at 1 on multiple tests', function(assert){
              assert.equal(foo.doStuff(), 1); // this obviously won't
         });
     }

     return runTests;
});
如何为每次测试重置
foo

我想保留
foo
一个具有启示性的模块,即不将其转换为具有修改原型的构造函数


我尝试了
var foo=require('foo'),但由于requirejs是基于AMD的,它会抱怨加载顺序错误。

虽然这肯定不是最干净的方式,但通过将函数保存为字符串,并在每次测试之前重新创建函数,可以实现相同的效果

var fooString = foo.toString();
QUnit.testStart(function() { eval('foo = ' + fooString});
我建议签出为您的测试创建一个独立的上下文。Squire旨在通过创建一个隔离的RequireJS上下文来注入模拟依赖项。这样做的一个副作用是每次调用injector.require()时都会重新加载“foo”库,从而重置库的状态。唯一的缺点是您的测试需要是异步的

// testfoo.js
define(['Squire', 'foo'], function (Squire, foo) {

 'use strict';

  QUnit.start();

  QUnit.module('foo', {
    setup: function () {
    },
    teardown: function () {
    }
  });

  QUnit.test('Testing foo counter in main context.', 2, function (assert) {
    assert.equal(foo.doStuff(), 1); // this will work
    assert.equal(foo.doStuff(), 2); // this should work also.
  });

  QUnit.test('Testing foo counter in context created by Squire.', 1, function (assert) {
    var done = assert.async(),
      injector = new Squire();

    injector.require([
      'foo'
    ], function (foo) {
      assert.equal(foo.doStuff(), 1); // this will work.
      done();
    });

  });

});

我在这里发布了一个示例项目:

虽然这个代码片段可能会回答这个问题,但如果您能解释它是如何解决这个问题的,对未来的读者来说将更有价值。谢谢您的反馈。我希望其他人能给出比这更好的答案。。。哈哈,我会更新的,谢谢,我会留意的。你能用“…你的测试需要是异步的”来详细说明缺点吗。你是在暗示测试不能相互依赖吗?如果是这样的话,我会说这是一件好事,因为它们不应该这样。当一个模块在初始化期间调用另一个模块时,这是很有帮助的,例如bar.js->define(['foo'],function(foo){foo.doStuff();})。如果希望foo.doStuff()返回特定结果或引发异常,可以使用Squire注入foo.js的mock,例如injector.mock('foo',fooMock).require(['bar',function(bar){..})