33

我尝试在节点中使用测试工具 mocha。考虑以下测试场景

var requirejs = require('requirejs');

requirejs.config({
    //Pass the top-level main.js/index.js require
    //function to requirejs so that node modules
    //are loaded relative to the top-level JS file.
    nodeRequire: require
});


describe('Testing controller', function () {

    it('Should be pass', function (done) {
            (4).should.equal(4);
            done();
    });

    it('Should avoid name king', function (done) {
        requirejs(['../server/libs/validate_name'], function (validateName) {
            var err_test, accountExists_test, notAllow_test, available_test;
            validateName('anu', function (err, accountExists, notAllow, available) {
                accountExists.should.not.be.true;
                done();
            });

        });
    });

});  

作为测试结果,我得到了:

$ make test
./node_modules/.bin/mocha \
                --reporter list

  . Testing controller Should be pass: 0ms
  1) Testing controller Should avoid name anu

  1 passing (560 ms)
  1 failing

  1) Testing controller Should avoid name anu:
     Uncaught TypeError: Cannot read property 'should' of null
      at d:\townspeech\test\test.spec.js:23:30
      at d:\townspeech\server\libs\validate_name.js:31:20
      at d:\townspeech\test\test.spec.js:22:13
      at Object.context.execCb (d:\townspeech\node_modules\requirejs\bin\r.js:1869:33)
      at Object.Module.check (d:\townspeech\node_modules\requirejs\bin\r.js:1105:51)
      at Object.Module.enable (d:\townspeech\node_modules\requirejs\bin\r.js:1376:22)
      at Object.Module.init (d:\townspeech\node_modules\requirejs\bin\r.js:1013:26)
      at null._onTimeout (d:\townspeech\node_modules\requirejs\bin\r.js:1646:36)
      at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)



make: *** [test] Error 1

第一遍没有任何复杂性,但第二遍似乎无法附加模块 shouldjs。为什么?

4

5 回答 5

78

我有同样的问题。我通过使用解决了它:

(err === null).should.be.true;

于 2013-11-15T06:29:12.993 回答
30

可以直接使用 should

should.not.exist(err);
于 2014-03-12T18:23:31.807 回答
9

这是该库的一个已知问题should:随着它的扩展object,当然它仅在您拥有具体对象时才有效。As null,根据定义,意味着您没有对象,您不能在其上调用任何方法或访问其任何属性。

因此,should在这种情况下不可用。

基本上,您有两种选择来处理这个问题:

  1. 你可以交换actualexpected。这样,只要您不期望null,您一开始就有一个对象,因此可以访问它的should属性。但是,这并不好,因为它会改变语义,并且并非在所有情况下都有效。
  2. should您可以通过另一个没有此问题的断言库来交换该库。

就个人而言,我会选择选项 2,而我个人对此的高度主观个人最喜欢的是node-assertthat(它是由我编写的,因此它是我的最爱)。

无论如何,还有很多其他选项,例如expect。随意使用任何最适合您编写测试风格的断言库。

于 2013-08-07T12:06:13.877 回答
6

我在这里没有提到的另一种选择:

should(err === null).be.null

在你的例子中,这将是:

should(accountExists).be.null
于 2014-09-23T05:05:31.330 回答
1

我总是发现使用和如下expect效果更好:nullundefined

expect(err).be.null

于 2018-08-23T00:08:14.900 回答