Primeiro, vamos ver como implementar o let
auxiliar. Como você já deve ter adivinhado, não podemos usar let
como nome, pois let já é uma palavra-chave javascript. Vamos chamá-lo ao given
invé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 subject
ajudante. Nesse contexto, o assunto é apenas um proxy para o given
auxiliar 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)