edit this page - page history - about editing

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

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.
Categories: Testing | Chai
edit this page - what links to here? - page history - top
Last edited by jevon jevon 36 months ago