Подтвердить что ты не робот

Должен ли js не читать свойство 'should' из null

Я пытаюсь использовать инструмент mocha для тестирования в node. Рассмотрим следующий тестовый сценарий

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. Почему?

4b9b3361

Ответ 1

Это известная проблема с библиотекой should: по мере расширения object, конечно, она работает только при наличии конкретного объекта. Поскольку null, по определению, означает, что у вас нет объекта, вы не можете вызывать какие-либо его методы или доступ к каким-либо его свойствам.

Следовательно, should недоступно в этом случае.

В принципе, у вас есть два способа справиться с этим:

  • Вы можете обменять actual и expected. Таким образом, пока вы не ожидаете null, у вас есть объект в начале и, следовательно, он может получить доступ к свойству should. Но это нехорошо, поскольку оно изменяет семантику и не работает во всех случаях.
  • Вы можете обменять библиотеку should другой библиотекой утверждений, которая не имеет этой проблемы.

Лично я бы пошел с вариантом 2, и мой очень субъективный личный фаворит для этого node-assertthat (который был написан мной, следовательно, это мой любимый).

Во всяком случае, есть много других опций, таких как expect. Не стесняйтесь использовать любую из этих библиотек утверждений, которые наилучшим образом соответствуют вашему стилю написания тестов.

Ответ 2

У меня была та же проблема. Я решил это, используя:

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

Ответ 3

Вы можете напрямую использовать

should.not.exist(err);

Ответ 4

Еще один вариант, который я не вижу здесь:

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

В вашем примере это будет:

should(accountExists).be.null