gems para colocar seus testes no trilho
TRANSCRIPT
![Page 1: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/1.jpg)
Testes on Rails
![Page 2: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/2.jpg)
Como testar?
![Page 3: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/3.jpg)
gem install rspec
![Page 4: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/4.jpg)
describe 'In my calculator' do context 'when plus 1 to 2' do it 'should return 3' do expect(Calculator.sum(1, 2)).to eq 3 end endend
Teste{ }
![Page 5: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/5.jpg)
Como testar código que depende de tempo?
![Page 6: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/6.jpg)
gem install timecop
![Page 7: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/7.jpg)
➔ Tenha controle do tempo ao executar os seus testes;
➔ Você consegue literalmente viajar no tempo;
➔ Poderíamos até prever o Bug do Milênio;
![Page 8: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/8.jpg)
{ }Tempo fixo
def start @started = Time.nowend
it 'should save the initial time' do Timecop.freeze do auction.start expect(auction.started).to eq Time.now endend
Teste
![Page 9: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/9.jpg)
{ }Variação de tempo
def bid(inc) return false if (Time.now - @started) > 120 @value += incend
describe 'after 2 minutes' do it 'should not accept bids' do auction.start
Timecop.travel(Time.now + 120) do expect(auction.bid(300)).to be_falsey
end endend
Teste
![Page 10: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/10.jpg)
Como testar dependência de APIs?
![Page 11: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/11.jpg)
Dificuldades
➔ O seu código depende do retorno da API
➔ Você estará testando também a API externa
➔ A requisição HTTP pode demorar (ou não funcionar…)
➔ Você não tem total controle do retorno da requisição
![Page 12: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/12.jpg)
def self.my_ip req = get 'http://httpbin.org/ip' parse = JSON.parse(req.body) parse['origin']end
it 'should get my ip' do expect(ExternalApi.my_ip).to eq '192.168.1.1'end
Teste
{ }Código
![Page 13: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/13.jpg)
gem install webmock
![Page 14: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/14.jpg)
➔ Criar mock das requisições HTTP
➔ Se você esquecer de alguma ou tiver dúvidas de como criar, ele sugere para você
➔ Isole totalmente o seu código de interferências externas
![Page 15: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/15.jpg)
def self.my_ip req = get 'http://httpbin.org/ip' parse = JSON.parse(req.body) parse['origin']end
it 'should get my ip' do stub_request(:get, "http://httpbin.org/ip"). with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}). to_return(:status=>200, :body=>'{"origin": "192.168.1.1"}') expect(ExternalApi.my_ip).to eq '192.168.1.1'end
Código
Teste
{ }
![Page 16: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/16.jpg)
Fixtures?!?
![Page 17: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/17.jpg)
Dificuldades
➔ Manter vários arquivos YAML
➔ Gerenciar relacionamentos entre as models / fixtures
➔ “Acoplamento” com o AR
➔ Fixtures dinâmicas
![Page 18: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/18.jpg)
# spec/fixtures/users.ymlfoo: name: Foo last_name: Bar
it "is composed of first name" do user = users(:foo) expect(user.name).to eq(“Foo”)end
Código
Teste
{ }
![Page 19: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/19.jpg)
# spec/fixtures/users.ymlfoo: id: 1 name: Foo last_name: Bar
it "is composed of street name" do address = addresses(:foo)
expect(address.street).to eq(“Foo Street”) expect(address.user.name).to eq(“Foo”)end
Código
Teste
{ }# spec/fixtures/addresses.ymlfoo_address: street: Foo Street number: 10 user_id: 1
![Page 20: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/20.jpg)
gem install factory_girl
![Page 21: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/21.jpg)
# spec/factories/users.rbFactoryGirl.define do factory :user do name “Foo” endend
it "is composed of first name" do user = FactoryGirl.create(:user) expect(user.name).to eq(“Foo”)end
Teste
{ }
![Page 22: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/22.jpg)
# spec/factories/foo.rbFactoryGirl.define do factory :user do name “Foo” end
factory :address do street “Foo Street” association :user, factory: :user endend
{ }
![Page 23: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/23.jpg)
Mais algumas coisas legais
#build
#create
#attributes_for
#build_stubbed
#hooks
![Page 24: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/24.jpg)
Como escolher as Gems para meu projeto?
![Page 25: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/25.jpg)
ruby-toolbox.com
![Page 26: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/26.jpg)
rubygems.org
![Page 27: Gems para colocar seus testes no trilho](https://reader031.vdocuments.site/reader031/viewer/2022022411/58ec92851a28abfe0a8b459d/html5/thumbnails/27.jpg)
https://github.com/webgoal/tests-on-rails