The Problems with Chai
Javascript - EmberJS - Testing
Chai is a pretty reasonable testing framework. But there are some key problems that make it much harder than it should be to test.
Very few methods provide an optional message
expect(true).to.be.false('message')
expect(undefined).to.exist('message')
Both of these assertions will fail with “is not a function”. This means the only message you will get back is expected true to be false and expected undefined to be defined. How helpful. I’ve created https://github.com/chaijs/chai/issues/272 to hopefully resolve this.
Update: It may be the best way to do this is expect(true).to.equal(true, 'message')
.
define
and it
cannot have parameterised tests
define 'my thing', ->
for i in [0..6]
it 'tests ' + i, ->
expect(i).to.equal(i)
This won’t work. I haven't found a way to do parameterised tests yet. One option is to use async.each
: http://stackoverflow.com/a/17573188/39531
async.each([1,2,3], function(itemNumber, callback) {
describe('Test # ' + itemNumber, function () {
it("should be a number", function (done) {
expect(itemNumber).to.be.a('number')
done()
});
});
callback()
});
Or, you can use Array#forEach (thanks @jamesotron):
define 'my thing', ->
[0..6].forEach (i) ->
it 'tests ' + i, ->
expect(i).to.equal(i)
Chaining your own properties is way too hard
It’s easy enough to define a basic assertion, for example expect(foo).to.be.present
.
But if you want to also support expect(foo).to.not.be.present
, then you have to go through a huge amount of work to store these properties through the assertion chains or something.
All assertions are defined in terms of the expect() object
That means you cannot (easily) have a new assertion like expect(".class").to.be.present
, because we need to define the “.present” w.r.t. the ".class"
string, and not what would eventually be a $() selector.
That also means that you can not have an easy-to-understand message for the presence (or not) of elements, because the only context that you have available is the tested object.
(In our project, we could not use the chai-jquery
plugin because it interfered with EmberJS: it messes up expect(find(...)).to.be.empty
from EmberJS (find()
returns a JQuery object).)
You cannot run partial tests or rerun failed tests
This is probably a problem with Mocha instead.