Testando CoffeeScript com Visual Studio, Resharper, QUnit e Web Workbench

(Se não quiser ver a história que me motivou a resolver o problema, pule os primeiros 4 parágrafos)

Isso era uma coisa que eu queria fazer faz tempo: escrever testes de unidade no Visual Studio utilizando QUnit e CoffeeScript. O código testado poderia ser Javascript ou CoffeeScript, não importa, o importante era pelo menos o teste ser em CoffeeScript, que é uma linguagem muito superior (lembre-se: seja feliz e use CoffeeScript).

Pois bem, se fosse testar com Javascript seria fácil, o Resharper já trouxe esse suporte na versão 6.0, que saiu faz tempo (já estamos na 6.1). Com ele, basta acrescentar os testes QUnit com Javascript e eles aparecem na tela de testes do Resharper, e é possível rodar por ali mesmo, super prático. Mas eu queria fazer isso com CoffeeScript.

E não dava. Não dava porque o CoffeeScript por padrão gera um closure que envolve todo o código. A única maneira seria gerar o código sem esse closure, que o compilador do CoffeeScript suporta. Mas eu também queria usar o Web Workbench, que facilita minha vida gerando o Javascript pra mim. Sem ele eu teria que abrir um processo do compilador do CoffeeScript que ficasse observando o diretório de scripts. Não que fosse o fim do mundo, mas eu queria algo mais automatizado. Até já trabalhei assim, mas o problema é que é chato, e eu trabalho em time, e isso é mais um complicador.

Aí a Mindscape, que faz o Web Workbench, colocou lá uma feature escondida. Você tem como dizer ao compilador para gerar bare (sem o closure). Basta acrescentar uma linha.

Então fica assim: Instale o Resharper (a partir do 6.0, idealmente o 6.1), instale o Web Workbench. Crie um arquivo .coffee, e no topo dele coloque:

#* coffee-compile-options: bare: true

 

Coloque a referência para o arquivo sendo testado apontando para o arquivo Javascript. Assim:

`/// <reference path="Calculadora.js" />`

 

A crase é necessária porque ela indica ao CoffeeScript que isso é código Javascript, então ele simplesmente copia essa linha sem a crase para o arquivo final.

Escreva seu teste normalmente. Por exemplo, esse é o meu:

#* coffee-compile-options: bare: true

`/// <reference path="Calculadora.js" />`

module "calculadora"

test "Soma", ->
    c = new Calculadora()
    equals(5, c.Soma(2, 3))

 

E aqui está o arquivo sendo testado:

class Calculadora
    Soma: (a, b) ->
        a + b
window.Calculadora = Calculadora

 

Com isso já consigo testar. O teste aparece normalmente na janela do Resharper:

Teste escrito com Coffeescript e QUnit aparecendo na janela de testes do Resharper

E posso rodá-lo:

Teste após rodar

Ele abre uma página web e roda o teste pra mim:

No browser, após rodar o teste

Se quiser, posso rodar diretamente pelo arquivo .js:

Rodando o teste direto no arquivo js

O código fonte do projeto completo, está no BitBucket e pode ser baixado.

E aí, o que acharam?

Autor: Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador.
Programa porque gosta, e começou a trabalhar com isso porque acha que trabalhar como administrador é meio chato. Por esse motivo sempre diz que nunca mais vai virar gerente de ninguém. E também porque acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é melhor que hierarquia. Mas isso é outro assunto.
Foi reconhecido  Microsoft MVP depois que alguém notou que ele não dormia a noite pra ficar escrevendo artigos, cuidando e participando do .Net Architects, gravando o podcast Tecnoretórica, escrevendo posts no blog e falando o que bem entende no twitter @giovannibassi. E por falar nisso é no twitter que conta pra todos que gerencia de projetos deve ser feita pelo time e não por um gerentes, que greves em TI são coisas sem sentido e que stored procedure com regras de negócio são malígnas.
Você já deve ter percebido (até porque está lá na primeira frase) que Giovanni é agilista. De tanto gostar disso ele trouxe os programas de certificação e treinamento  PSD e PSM da Scrum.org pro Brasil, e por causa deles, do MVP e de algum trabalho que aparece tem que ficar indo pros EUA de vez enquando, coisa que prefere não fazer. (É bem comum você ouvir ele perguntando porque a Scrum.org e a Microsoft não estão na Itália, por exemplo.)
Junto com alguns Jedis criou a Lambda3, que, apesar de ser pequena e de não ser muito comum no Brasil, insiste em fazer projetos e consultoria direito. Por causa da Lambda3 ele tem trabalhado mais do que quando era consultor independente, mas menos do que a maioria das pessoas. Quer dizer, isso se você considerar que os trabalhos junto à comunidade não são trabalho, caso contrário ele trabalha mais que a maioria das pessoas.
Recentemente ele resolveu que merecia viver melhor e ganhar uns anos de vida e desistiu de ser sedentário, fazendo algum barulho de vez em quando com os amigos no twitter com a hashtag #DotNetEmForma. Por causa do convite recente de amigos do lado Open Source (que ele respeita e admira), começou a escalar, e agora está sempre com as mãos machucadas. Mas ainda dá pra programar. Você encontra ele sempre em algum evento, como o TechEd, e o DNAD, mas também outros menos comuns para o pessoal do .NET, como a RubyConf. Nesses eventos, ou ele está vendo palestras, ou batendo papo com alguém, ou codando alguma aplicação que alguém achou que dava pra fazer durante o evento.