操作系统:Windows 10
节点版本:0.10.36
摩卡全球版:1.21.4
我正在尝试使用mocha对我的代码进行单元测试,但是我试图测试的代码中的局部变量在测试之间持续存在,导致问题。
当我查看require.cache
内部时,在测试之间,我看不到我的模块。我的理解是,如果我想在测试之间重置此模块,我应该清除缓存。
我做了一个小节点项目来演示这个问题:
package.js:
{
"name": "cache-test",
"version": "0.0.1",
"dependencies": {
"lodash": "4.5.0"
},
"devDependencies": {
"chai": "1.9.2",
"mocha": "1.21.4",
"mockery": "1.4.0",
"sinon": "1.10.3",
"app-root-path":"*"
}
}
module.js:
var foo = "default value";
exports.init = function(){
foo = 'init';
}
exports.returnFoo = function(){
return foo;
}
测试/测试module.js
var chai = require("chai"),
expect = chai.expect,
mockery = require("mockery"),
appRoot = require('app-root-path');
var module;
describe("module", function () {
before(function () {
mockery.enable({ useCleanCache: true });
});
beforeEach(function () {
mockery.registerAllowable(appRoot + "/module", true);
module = require(appRoot + "/module");
});
afterEach(function () {
console.log('deleting', require.cache[require.resolve(appRoot + "/module")]);
delete require.cache[require.resolve(appRoot + "/module")];
module = null;
mockery.deregisterAll();
});
after(function () {
mockery.disable();
});
describe("test",function(){
it("foo should be 'init' after running init()",function(){
module.init();
console.log('foo is ',module.returnFoo());
expect(module.returnFoo()).to.equal('init');
});
it("foo should be 'default value' if init() is not run",function(){
console.log('foo is ',module.returnFoo());
expect(module.returnFoo()).to.equal("default value");
});
});
});
运行mocha
打印
module
test
foo is init
√ foo should be 'init' after running init()
deleting undefined
foo is init
1 failing
答案 0 :(得分:1)
哦,我需要添加
mockery.resetCache()
到我的afterEach
函数。这解决了它。
似乎useCleanCache
选项,并且从require.cache
删除条目与彼此不兼容,因为前者使其不会出现在后者中。
所以它是:
OR
但不要试图混合搭配。