我目前正在尝试在javascript中运行测试套件时检测一些代码,但在使用mocha实际吐出数据时遇到问题。
似乎当我尝试打印出某些东西(甚至写入文件)时,我没有成功。
见下面的样本:
var Foo = require('./lib')
Foo()
module.exports = function(a) { return a + 1}
var fs = require('fs')
module.exports = function() {
setTimeout(function() {
fs.writeFile('test_file', 'hello world', function(){})
console.log('hello finished')
}, 1000)
console.log('hello begin')
}
var x = require('./main')
describe("some test", function() {
it("should do something", function(done) {
done()
})
})
结果应该创建一个名为test_file
的文件,其内容为hello world
。
我创建了一个存储库,其中包含可以轻松克隆和测试的完整示例。
答案 0 :(得分:0)
在您的测试文件中,您要导入main
。但main
仅是您在main.js
中导出的内容:function(a) { return a + 1}
。
您应该导出整个文件:
var Foo = require('./lib')
module.exports = function(a) {
Foo();
return a + 1;
}
答案 1 :(得分:0)
Duno Mocha究竟是如何工作的(即它如何管理线程池以进行测试,甚至是否拥有该池),但看起来Mocha在测试完成后会杀死线程。
因此,当线程已经死亡时,setTimeout不会触发事件。
(而setTimeout(...,1)将触发事件 - 只需尝试一下)
答案 2 :(得分:0)
根本问题是像你一样使用done
不起作用。摩卡进入你的测试,执行它,马上调用done
。所以摩卡认为它已经完成并退出。
还有lib.js
设计糟糕的事实。你可以这样实现它:
const fs = require('fs');
module.exports = function(cb) {
setTimeout(function() {
fs.writeFile('test_file', 'hello world', cb);
console.log('hello finished');
}, 1000);
console.log('hello begin');
};
我刚刚将cb
参数添加到导出的函数中并将其传递给fs.writeFile
。
最低限度检查正确文件的测试会执行此操作:
const fs = require("fs");
const lib = require("./lib");
const assert = require("assert");
describe("some test", function() {
it("should do something", function(done) {
lib(function (err) {
if (err) {
done(err);
}
fs.readFile("./test_file", function (err, data) {
if (err) {
done(err);
}
assert.equal(data, "hello world");
done();
});
});
});
after(function (done) {
fs.unlink("./test_file", function () {
// We don't want a cascading failure here if the test
// above failed to create the file so we ignore errors
// here.
done();
});
});
});
请注意我是如何在上面直接测试lib.js
的。这就是单元测试的工作原理。测试最小功能单元。然后,您可以编写测试以检查main.js
是否调用lib.js
导出的函数。