O documento fornece dicas sobre testes com RSpec, incluindo: 1) sintaxe de expectativas com RSpec; 2) descrição de testes; 3) uso de contextos e sujeitos; 4) integração com ferramentas como WebMock, VCR e Factory Girl.
11. spec/models/pokemon_spec.rb
it 'exibe o nome e o id nacional' do
pokemon = Pokemon.new(nome: 'Charizard', id_nacional: 6)
pokemon.nome_completo.should eq('Charizard - 6')
end
12. spec/models/pokemon_spec.rb
it 'exibe o nome e o id nacional' do
pokemon = Pokemon.new(nome: 'Charizard', id_nacional: 6)
expect(pokemon.nome_completo).to eq('Charizard - 6')
end
18. spec/models/pokemon_spec.rb
it 'exibe o nome e o id nacional' do
pokemon = Pokemon.new(nome: 'Charizard', id_nacional: 6)
expect(pokemon.nome_completo).to eq('Charizard - 6')
end
22. spec/models/pokemon_spec.rb
describe '#nome_completo' do
it 'exibe o nome e o id nacional quando possui os valores' do
pokemon = Pokemon.new(nome: 'Charizard', id_nacional: 6)
expect(pokemon.nome_completo).to eq('Charizard - 6')
end
it 'é nil quando não possui o nome e o id nacional' do
pokemon = Pokemon.new
expect(pokemon.nome_completo).to be_nil
end
end
26. spec/models/pokemon_spec.rb
context 'quando possui nome e o id nacional' do
before do
@pokemon = Pokemon.new(nome: 'Charizard', id_nacional: 6)
end
it 'exibe o nome e o id nacional' do
expect(@pokemon.nome_completo).to eq('Charizard - 6')
end
end
27. spec/models/pokemon_spec.rb
context 'quando possui nome e o id nacional' do
let(:pokemon) do
Pokemon.new(nome: 'Charizard', id_nacional: 6)
end
it 'exibe o nome e o id nacional' do
expect(pokemon.nome_completo).to eq('Charizard - 6')
end
end
28. spec/models/pokemon_spec.rb
context 'quando possui nome e o id nacional' do
subject do
Pokemon.new(nome: 'Charizard', id_nacional: 6)
end
it 'exibe o nome e o id nacional' do
expect(subject.nome_completo).to eq('Charizard - 6')
end
end
50. bash
Failure/Error: CriadorPokemon.new(6)
WebMock::NetConnectNotAllowedError:
Real HTTP connections are disabled. Unregistered request: GET http://
pokeapi.co/api/v1/pokemon/6/ with headers {'Accept'=>'*/*', 'Accept-
Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Host'=>'pokeapi.co', 'User-
Agent'=>'Ruby'}
You can stub this request with the following snippet:
stub_request(:get, "http://pokeapi.co/api/v1/pokemon/6/").
with(:headers => {'Accept'=>'*/*', 'Accept-
Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Host'=>'pokeapi.co', 'User-
Agent'=>'Ruby'}).to_return(:status => 200, :body => "", :headers => {})
55. spec/services/criador_pokemon_spec.rb
describe 'pokemon criado' do
before do
caminho_arquivo = 'spec/fixtures/services/criador_pokemon/resposta.txt'
arquivo_resposta = File.new(caminho_arquivo)
stub_request(:get, 'http://pokeapi.co/api/v1/pokemon/6/')
.to_return(arquivo_resposta)
criador_pokemon.criar
end
end
64. spec/support/vcr.rb
VCR.configure do |c|
# ...
c.configure_rspec_metadata!
end
spec/spec_helper.rb
RSpec.configure do |config|
# ...
config.treat_symbols_as_metadata_keys_with_true_values = true
end
77. spec/factories/artigos.rb
factory :artigo do
titulo 'Diversas dicas do RSpec'
conteudo 'Conteúdo de Diversas dicas do RSpec'
factory :artigo_aprovado do
aprovado true
end
factory :artigo_nao_aprovado do
aprovado false
end
end
80. spec/factories/artigos.rb
factory :artigo do
titulo 'Diversas dicas do RSpec'
conteudo 'Conteúdo de Diversas dicas do RSpec'
trait :aprovado do
aprovado true
end
trait :nao_aprovado do
aprovado false
end
end
97. app/models/pokemon.rb
class Pokemon < ActiveRecord::Base
scope :escolhidos_ontem, -> do
where(escolhido_em: 1.day.ago.midnight..Time.zone.now.midnight)
end
end
106. app/models/pokemon.rb
class Pokemon < ActiveRecord::Base
validates :nome, :id_nacional, presence: true
scope :escolhidos_ontem, -> do
where(escolhido_em: 1.day.ago.midnight..Time.zone.now.midnight)
end
end
112. spec/models/pokemon_spec.rb
describe 'validações' do
it { should validate_presence_of(:nome) }
it { should validate_presence_of(:id_nacional) }
it { should validate_numericality_of(:id_nacional).only_integer
.is_greater_than(0) }
end