2016-04-05 18 views
-1

Ben raylarda bir acemi duyuyorum ve şimdi denetleyici kodumu stubbs ve alay ile test etmeye çalışıyorum. Kodda sahte kullanmayı denedim ama düzgün bir şekilde yapamadım. Lütfen bana refactored doğru kodu ile yardımcı olun.Yeni yazdığınız kod için açıklama ile bana yardımcı olun.Mock and stubb kullanarak Refactor kodu

require 'rails_helper' 

RSpec.describe ArticlesController, type: :controller do 
    let(:article) { create :article} 
    let(:art_params) { attributes_for(:article) } 
    let(:dbl) {double(:articles)} 
    describe 'GET index' do 
    it 'assigns @articles' do 
     get :index 
     allow(dbl).to receive(:articles).and_return article 
     expect(dbl.articles).to eql(article) 
     #expect_any_instance_of(Article).to receive(:save).and_return(true) 
    end 

    it 'renders the index template' do 
     get :index 
     allow(dbl).to receive(:articles) 
     expect(response).to render_template('index') 
    end 
    end 

    describe 'GET :new' do 
    it 'render new template' do 
     get :new 
     expect(response).to render_template(:new) 
    end 
    end 

    describe 'POST/create' do 
    it 'created a new article ' do 
    expect { post :create, article: art_params }.to change(Article, :count).by(1) 
    end 
    end 

    describe 'POST/create not' do 
    it 'did not create a new user' do 
    # expect(art_params).to receive(attributes_for :article).with(content:) 
     art_params = { article: attributes_for(:article, content: nil) } 
     post :create, art_params 
     expect(response).to render_template(:new) 
    end 
    end 

    describe 'GET/edit' do 
    it 'displays the edit template' do 
     get :edit, id: article.id 
     expect(response).to render_template(:edit) 
    end 
    end 

    describe 'POST/update' do 
    it 'displays the update template' do 
     post :update, id: article.id, article: attributes_for(:article) 
     expect(response).to redirect_to(article_path(article.id)) 
    end 
    end 

    describe 'POST/DELETE' do 
    it 'destroys the article template' do 
     dbl = double() 
     article = create :article 
     expect { delete :destroy, id: article.id }.to change(Article, :count).by(-1) 

    end 
    end 
en 

d

+1

Benim görüşüme göre, alay ve kodlamalar denetleyici kodunda bu kadar kullanılmamalıdır. Kontrolör eylemlerinin küçük, kompakt ve kullanımı kolay olduğu varsayılmaktadır. Saplamalar, örneğin, testlerde geri aramalardan kurtulmak veya uzun bir yöntem veya üçüncü bir taraf talebi saptamak için birim testlerinde daha fazla kullanılır. – Kkulikovskis

+0

Doğru, ancak bazı durumlarda kullanışlı olabilir. Örneğin, testlerin daha hızlı ilerlemesini ve veritabanına her seferinde vurulmasını istemiyorsanız, örneğin bir “ActiveRecord # save” a çağrı yapabilirsiniz. – born4new

cevap

1
# This is a stub 
    fake_article = allow(article).to receive(:compute_price).and_return(200) 

    # This too 
    another_fake_article = double(compute_price: 200) 

    # This is a mock 
    expect(article).to receive(:where).with(status: :closed) 

makale { status: :closed } parametre karma ile where yöntemini iptal etmemesi halinde sonuncusu başarısız olur. Umarım yardımcı olur.

2

Alay etmek ve saplamak, gerçekten doğru olması için oldukça gelişmiş bir test konseptidir. Gerçek bir anlayış olmadan, test edilen kod değiştirildiğinde her defasında kırılan hassas testler oluşturmak kolaydır. Ya da her zaman geçecek testler. Örneğin, aşağıdaki kod asla başarısız olamaz. Bir çift (dbl) bir sınama oluşturursunuz, sonra bu çifte bir yöntem (#articles) saplama ve bu yöntem çağrısının article örneğini döndüreceğini belirtirsiniz. Beklentide, test çiftindeki davranışını tanımladığınız için, test çiftinde #articles yöntemini çağırmalısınız.

let(:article) { create :article } 
let(:dbl) { double(:articles) } # the test double 

it 'assigns @articles' do 
    get :index 
    allow(dbl).to receive(:articles).and_return article # stubbing 
    expect(dbl.articles).to eql(article) # invoking the stubbed method 
end 

O örnekten get :index hattını kaldırmak için deneyebilirsiniz, ve kod hala geçtiğini göreceksiniz. Rails ile programlama başladı ise

let(:article) { create :article } 

it 'assigns @articles' do 
    get :index 
    expect(assigns(:articles)).to contain_exactly(article) 
end 

ve RSpec, ben zaman yapabilirsiniz gerçek nesneleri kullanarak öneriyoruz:

Sadece yanı stubbing olmadan örnek yazabiliriz. Rspec-rayların belgelerinin çok iyi örnekleri vardır: http://www.relishapp.com/rspec/rspec-rails/v/3-4/docs RSpec belgelerinin alay edilmesi ve inlenmesi hakkında daha fazla bilgi edinmek isterseniz, bunun için de oldukça iyi bir yer.

+0

@ Laura: çok teşekkürler! –