摩卡的副作用

时间:2016-12-16 15:56:26

标签: javascript mocha

我目前正在尝试在javascript中运行测试套件时检测一些代码,但在使用mocha实际吐出数据时遇到问题。

似乎当我尝试打印出某些东西(甚至写入文件)时,我没有成功。

见下面的样本:

main.js

var Foo = require('./lib')

Foo()

module.exports = function(a) { return a + 1}

lib.js

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')
}

test.js

var x = require('./main')
describe("some test", function() {
  it("should do something", function(done) {
     done()
   })
})

结果应该创建一个名为test_file的文件,其内容为hello world

我创建了一个存储库,其中包含可以轻松克隆和测试的完整示例。

https://github.com/hamhut1066/mocha-mockup

3 个答案:

答案 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导出的函数。