should - tdd mocha chai
¿Cuál es la diferencia entre assert, expect y should en Chai? (1)
¿Cuál es la diferencia entre assert
, expect
y should
, y cuándo usar qué?
assert.equal(3, ''3'', ''== coerces values to strings'');
var foo = ''bar'';
expect(foo).to.equal(''bar'');
foo.should.equal(''bar'');
Las diferencias están documentadas allí .
Las tres interfaces presentan diferentes estilos de realización de aserciones. En definitiva, realizan la misma tarea. Algunos usuarios prefieren un estilo sobre el otro. Dicho esto, también hay un par de consideraciones técnicas que vale la pena destacar:
Las interfaces assert y expect no modifican
Object.prototype
, mientras que should does. Por lo tanto, son una mejor opción en un entorno en el que no puede o no quiere cambiarObject.prototype
.Las interfaces assert y expect admiten mensajes personalizados en cualquier lugar. Por ejemplo:
assert.isTrue(foo, "foo should be true"); expect(foo, "foo should be true").to.be.true;
El mensaje "foo debería ser verdadero" se enviará junto con la afirmación fallida si la afirmación falla. No tiene la oportunidad de establecer un mensaje personalizado con la interfaz should.
(Nota histórica: durante mucho tiempo, esta respuesta decía que para obtener un mensaje personalizado con expect
, tenía que usar una solución provisional. Aurélien Ribon me informó que transmitir un mensaje para expect
como un segundo parámetro funciona. Por consiguiente, no hay Necesito una solución alternativa. No he podido encontrar qué versión de Mocha comenzó a brindar soporte para este mensaje, ni he podido encontrar qué versión de la documentación lo documentó por primera vez.
Tenga en cuenta que assert.isTrue(foo)
, expect(foo).to.be.true
y foo.should.be.true
todos emiten lo siguiente si no utiliza un mensaje personalizado, y foo === 1
:
AssertionError: expected 1 to be true
Entonces, mientras que la interfaz de esperar y debería ser más agradable de leer , no es que una interfaz sea más informativa que la otra cuando falla una afirmación. Este mensaje, que es idéntico para las tres interfaces, no le dice exactamente qué estaba probando, solo que el valor que obtuvo fue 1
pero quería true
. Si desea saber qué estaba probando, debe agregar un mensaje.