Assunto semelhante ao RSpec / deixar ajudantes para Jasmine

Primeiro, vamos ver como implementar o letauxiliar. Como você já deve ter adivinhado, não podemos usar letcomo nome, pois let já é uma palavra-chave javascript. Vamos chamá-lo ao giveninvés.

Ajudante dado

Basicamente, o helper fornecido registrará um hook beforeEach e um afterEach que criará um acessador get na especificação atual com o nome fornecido. Usaremos um acessador em vez de uma propriedade simples para permitir uma avaliação lenta do bloco passado. Observe que se você precisar executar suas especificações em navegadores que não suportam Object.defineProperty, você pode usar uma propriedade, mas perderá a avaliação preguiçosa.

# With Object.defineProperty
global.given = (name, block) ->
beforeEach
->
# The resulting value is cached after the first evaluation
cache
= null
Object.defineProperty this, name, configurable: true, get: ->
cache
||= block.call(this)
afterEach
->
# To avoid conflict accross tests the
delete @[name]

Aqui está a versão com propriedade:

# Without Object.defineProperty
global.given = (name, block) ->
beforeEach
-> @[name] = block.call(this)
afterEach
-> delete @[name]

Agora podemos usá-lo em nossas especificações:

describe 'a spec', -> 
given
'value', -> 10

it
'should do something with value' ->
# ...

Ajudante de Assunto

Agora vamos seguir com o subjectajudante. Nesse contexto, o assunto é apenas um proxy para o givenauxiliar que pode ser chamado com ou sem um nome:

global.subject = (name=null, block) -> 
[name, block] = [block, name] if typeof name is 'function'
given
'subject', block
given name
, block if name?

E podemos usá-lo em nossa especificação assim:

describe 'a spec', -> 
given
'value', -> 10
given
'result', -> 20
subject
-> new MyObject

it
'should do something with value' ->
expect
(@subject.doSomething(@value)).toBe(@result)

Ou:

describe 'a spec', -> 
given
'value', -> 10
given
'result', -> 20
subject
'myObject', -> new MyObject

it
'should do something with value' ->
expect
(@myObject.doSomething(@value)).toBe(@result)