Exemplos de código executável
RSpec fornece uma Domain Specific Language(DSL) com o qual você pode expressar exemplos executável do comportamento esperado de seu código.
Imagine que você estivesse falando com um cliente solicitando o software para o seu banco. Parte da conversa que bem poderia ser assim:
Cliente: Ele deve ter um saldo de $0.
Veja como podemos expressar essa conversa de RSpec:
it "should have a balance of $0" do
…
end
end
O describe() é um método que retorna uma classe ExampleGroup, que contém um conjunto de exemplos de um comportamento específico do sistema que pretende descrever.
O it() é um método que retorna uma instância da ExampleGroup em que esse exemplo é executado.
Quando você executar esse exemplo, RSpec pode fornecer um relatório como este:
- Deve ter um saldo de $0
before() e after()
Você pode usar before() e/ou after() para definir um código que é executado antes e depois de cada exemplo, ou apenas uma vez por exampleGroup:
before(:all) do
# Este é executado apenas uma única vez, antes de todos os exemplos
# e antes de qualquer blocks before(:each)
end
before(:each) do
# Este é executado antes de cada exemplo
end
before do
# :each é o padrão, então este é o mesmo que before(:each)
end
it "should do stuff" do
# deve fazer coisas
…
end
it "should do more stuff" do
# deve fazer mais coisas
…
end
after(:each) do
# isto é, após cada exemplo
end
after do
# :each é o padrão, então este é o mesmo que after(:each)
end
after(:all) do
# Este é executado apenas uma única vez depois de todos os exemplos
# E depois de qualquer blocks after(:each)
end
end
Atenção: A utilização do before(:all) e after(:all) é desencorajada porque ela introduz dependências entre os exemplos. Mesmo assim, pode ser útil para operações se você sabe o que está fazendo.
Métodos Helper
Você pode escrever métodos helper(auxiliares) diretamente dentro de um Exemple Group:
it "…" do
helper_method
end
def helper_method
…
end
end
Métodos Helper Reutilizáveis
Você pode incluir métodos helper em vários ExampleGroups, basta colocar dentro de um módulo e em seguida, incluindo um módulo em seu exampleGroup:
def helper_method
…
end
end
describe "A new account" do
include AccountExampleHelperMethods
before do
@account = Account.new
end
it "should have a balance of $0" do
helper_method
@account.balance.should eql(Money.new(0, :dollars))
end
end
Exemplo Grupos Compartilhados
Você pode criar exemplo de grupos compartilhados e incluir os grupos em outros grupos.
Suponha que você tenha algum tipo de comportamento que se aplica a todas as edições do seu produto, grandes e pequenos.
Primeiro comportamento do fator de “compartilhamento”:
it "should behave like all editions" do
end
end
Então, quando você precisa definir o comportamento para as grandes e pequenas edições,
referência o comportamento compartilhado usando o método it_should_behave_like ()
it_should_behave_like "all editions"
it "should also behave like a small edition" do
end
end
describe "LargeEdition" do
it_should_behave_like "all editions"
it "should also behave like a large edition" do
end
end
it_should_behave_like irá procurar um ExampleGroup pela sua descrição, neste caso, “all editions”
Todas abaixo são incluídas em um grupo compartilhado:
* before(:all)
* before(:each)
* after(:each)
* after(:all)
* all included modules
* all methods
Exemplos de grupos compartilhados não podem extend(estender) as classes.
Vários exemplos grupos compartilhados pode ser referenciado em um grupo não compartilhado.
Exemplos de grupos compartilhados podem ser incluídos em outros grupos compartilhados:
it "should be payable" do
@employee.should respond_to(:calculate_pay)
end
end
shared_examples_for "All Managers" do
it_should_behave_like "All Employees"
it "should be bonusable" do
@employee.should respond_to(:apply_bonus)
end
end
describe Officer do
before(:each) do
@employee = Officer.new
end
it_should_behave_like "All Managers"
it "should be optionable" do
@employee.should respond_to(:grant_options)
end
end
$ spec officer_spec.rb
Officer
- should be payable
- should be bonusable
- should be optionable
Exemplos Pendentes
Há três formas de marcar um exemplo como “pendente”.
Deixar o bloco:
A saída será dizer pendente (ainda não implementado).
Use o método pendente com nenhum bloco:
pending("get the vocal chords working")
subject.should say("foo")
end
A saída será dizer PENDENTES (obter as cordas vocais de trabalho).
Use o método pendente com um bloco:
pending("get the vocal chords working") do
subject.should say("foo")
end
end
A saída será dizer PENDENTES (obter as cordas vocais de trabalho), e o exemplo falhará dizendo-lhe para que seja corrigido logo o bloco e não gera nenhum erro.




