Chai (GitHub: logicalparadox/Chai, npm: Chai Licença: MIT) é uma biblioteca de afirmação BDD/TDD para Node e para o navegador, que pode ser equiparada com qualquer framework de testes de JavaScript.
O Chai visa ser uma forma expressiva e facilmente acessível para escrever asserções para o projeto de testes JavaScript. Os desenvolvedores já começaram a expandir no linguagem disponível Chai por meio de plugins, como espiões, mocks/stubs e suporte para Query. Para começar, no entanto, penso que você encontrará a linguagem Chai fácil de aprender e poderosa o suficiente para até mesmo o mais indisciplinado cenário de testes.
A motivação para a Chai surgiu com o lançamento do Mocha, um incrível quadro de testes TJ Holowaychuk que também pode ser usado tanto com o Node, quanto com navegadores. Na época, não havia biblioteca de afirmação evidente a ser igualada com ele que permitisse que as mesmas afirmações fossem usadas no servidor e no cliente com a simplicidade inerente que o Mocha fornece.
O básico
Para começar no Node, adicione a Chai ao seu package.json sob o devDependacies. Ou, se estiver usando no navegador, inclua o script na sua página:
<script src="http://chaijs.com/chai.js" type="text/javascript"></script>
A Chai suporta atualmente todos os navegadores modernos: IE 9 +, Chrome (a partir do da versão 7), FireFox (a partir do 4) e o Safari (a partir do 5).
Estilos assertion
A linguagem Chai vem agrupada com três estilos assertion diferentes: expect, should e assert. As interfaces “expect” e “should” são semelhantes na medida em que são baseadas em linguagem descritiva de cadeias. A interface assert é semelhante ao módulo Node, mas inclui muitas outras assertions.
Para exemplo, vamos supor o seguinte:
var chai = require('chai')
, foo = 'bar'
, beverages = { tea: [ 'rooibos', 'matcha', 'oolong' ] };
Os primeiros são os estilos do BDD – expect e should:
var expect = chai.expect;
expect(foo).to.be.a('string').and.equal('bar');
expect(beverages).to.have.property('tea').with.length(3);
Como você pode ver, a interface expect fornece uma função como um ponto de partida para o encadeamento de assertions da linguagem. Como alternativa, a interface should se estende até o Object.prototype com o “should” como ponto de partida:
var should = chai.should();
foo.should.be.a('string').and.equal('bar');
beverages.should.have.property('tea').with.length(3);
Finalmente, o estilo TDD é exposto por meio da interface assert. Isto caracteriza a notação clássica de assert.test.
var assert = chai.assert;
assert.equal(foo, 'bar', 'Foo equal bar');
assert.length(beverages.tea, 3, 'We have three types of tea');
As poucas assertions que também estão disponíveis são a igualdade de profundidade, testes de exceção, e instanceof. A documentação completa da API está disponível para todos os estilos em Chaijs.com.
Estendendo Chai com plugins
Embora a Chai forneça todo o básico para testes, sabemos que pode haver muito mais nisso. A Chai pode facilmente ser estendida através de plugins que podem adicionar ou modificar o protótipo assertion do Chai. Um exemplo disso é a logicalparadox/chai-spies, uma função básica de implementação de espionagem.
Aqui está um exemplo simples de afirmar esses eventos que foram emitidos usando chai-spies:
var chai = require('chai')
, spies = require('chai-spies');
chai.use(spies);
var should = chai.should()
, myspy = chai.spy(originalFn); // originalFn not required
eventemitter.on('some event', myspy);
// ... testing
myspy.should.have.been.called.twice;
A abordagem com plug-in faz com que seja fácil de usar a Chai para testar cenários complexos. Chai-espiões também são bons recursos para desenvolvedores que desejam criar plugins que trabalham tanto para o Node, quanto para o navegador. E eles já começaram a construir em Chai:
chai-jquery (Licença: MIT), por John Firebaugh, proporciona uma integração profunda do jQuery com os estilos should e expect da Chai.
$('#header').should.have.class('foo');
expect($('#title')).to.have.html('Chai Tea');
sinon-chai (Licença: WTFPL), por Domenic Denicola, estende a Chai com assertions para uso com o framework Sinon.js.
mySpy.should.have.been.calledWith('foo');
expect(mySpy).to.have.been.calledWith('foo');
jaque (licença: MIT), por Veselin Todorov, é uma biblioteca de simulação/ramal que pode ser usada como um utilitário autônomo ou com Chai.
mockedMethod.should.have.been.called.twice;
expect(mockedMethod).to.have.been.called.twice;
?
Texto original disponível em http://dailyjs.com/2012/02/23/Chai/