gpt4 book ai didi

javascript - 在单元测试中重置模块

转载 作者:行者123 更新时间:2023-11-27 23:27:00 25 4
gpt4 key购买 nike

我有一个使用以下模式创建的 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 保留为一个揭示模块,即不将其转换为具有更改原型(prototype)的构造函数。

我尝试了 var foo = require('foo');,但由于 requirejs 是基于 AMD 的,它会提示以错误的顺序加载内容。

最佳答案

我建议查看SquireJS为您的测试创建一个隔离的上下文。 Squire 旨在通过创建隔离的 RequireJS 上下文来注入(inject)模拟依赖项。这样做的副作用是每次调用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();
});

});

});

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

关于javascript - 在单元测试中重置模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com