node.js - instalar - node js que es
¿Js no puede leer la propiedad ''debería'' de nulo? (5)
Ese es un problema conocido con la librería should
: como se extiende el object
, por supuesto, solo funciona cuando tienes un objeto concreto. Como null
, por definición, significa que no tiene un objeto, no puede llamar a ningún método ni acceder a ninguna de sus propiedades.
Por lo tanto, should
no está disponible en este caso.
Básicamente, tienes dos opciones de cómo lidiar con esto:
- Usted podría intercambiar
actual
yexpected
. De esta forma, siempre que no esperenull
, tiene un objeto al principio y, por lo tanto, puede acceder a su propiedadshould
. Pero, esto no es bueno, ya que cambia la semántica y no funciona en todos los casos. - Podría intercambiar la biblioteca
should
por otra biblioteca de aserciones que no tenga este problema.
Personalmente, node-assertthat opción 2, y mi favorito personal altamente subjetivo para esto es node-assertthat (que ha sido escrita por mí, por lo tanto, es mi favorita).
De todos modos, hay muchas otras opciones, como expect . Siéntase libre de usar cualquiera de estas bibliotecas de afirmaciones que mejor se adapte a su estilo de pruebas de escritura.
Intento utilizar la herramienta de prueba mocha en el nodo. Considere el siguiente escenario de prueba
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();
});
});
});
});
Como resultado de la prueba tengo:
$ 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
El primer pase sin ninguna complicación, pero el segundo, parece, que no podría adjuntar el módulo shouldjs. ¿Por qué?
Se puede utilizar directamente.
should.not.exist(err);
Siempre encuentro expect
funciona mejor con null
e undefined
siguiente manera:
expect(err).be.null
Una opción más que no veo mencionada aquí:
should(err === null).be.null
En tu ejemplo sería:
should(accountExists).be.null
Yo tuve el mismo problema. Lo solucioné usando:
(err === null).should.be.true;