2015-05-23 2 views
0

Так что, если ваш #create метод контроллера просто:Rspec испытывает трудности тестирования #create с помощью метода контроллера сборки

@testimonial = Testimonial.new(testimonial_params) 

И проверить это в ваших спецификациях как так:

testimonials_controller_spec.rb

describe "POST #create" do 
    context "with VALID attributes" do 
     it "creates new testimonial" do 
      expect { 
        post :create, testimonial: FactoryGirl.attributes_for(:testimonial) 
      }.to change(Testimonial, :count).by(1) 
     end 
    end 
end 

Он отлично работает. Код:

post :create, testimonial: FactoryGirl.attributes_for(:testimonial) 

Правильно.

Однако в моем TestimonialsController, мой метод создания на самом деле:

@testimonial = current_user.testimonials.build(testimonial_params) 

Мой RSpec метод не работает с этим. Что следует использовать вместо:

post :create, testimonial: FactoryGirl.attributes_for(:testimonial) 

?

ответ

3

Войдите в систему, прежде чем вызывать действие контроллера. Пожалуйста, найдите следующее:

#testimonials_controller_spec.rb 
require 'rails_helper' 
describe TestimonialsController, type: :controller do 

    let(:user) do 
    FactoryGirl.create :user 
    end 

    before do 
    sign_in user 
    end 

    describe "POST #create" do 
    context "with VALID attributes" do 
     it "creates new testimonial" do 
     expect { 
      post :create, testimonial: FactoryGirl.attributes_for(:testimonial) 
     }.to change(Testimonial, :count).by(1) 
     end 
    end 
    end 
end 
+0

Спасибо! Я не пробовал sign_in, потому что раньше у меня были проблемы с помощниками Devise, поэтому я предположил, что это не сработает. На этот раз я дал ему шанс, ожидая, что он не сработает, но это произошло. Должно быть, это было что-то, что я делал неправильно, пытаясь использовать помощников Devise с другой спецификацией. – Andy

+0

В этом конкретном случае я закончил работу с sign_in FactoryGirl.create (: student), которая сработала. ВОПРОС: как бы я смоделировал пользователя с подписью без использования помощника Devise? – Andy

-1

Строка не сохраняет и не сохраняет запись в базе данных. Почему бы не сделать это:

@testimonial = current_user.testimonials.new(testimonial_params) 
@testimonial.save 
+0

Ну, он работает в браузере при разработке и производстве! Отзывы сохраняются и отображаются без проблем. – Andy

+0

Я не уверен, но я думаю, что он должен быть построен, поэтому отзывы индексируются идентификатором пользователя. – Andy

+0

(отзывы принадлежат пользователям и пользователям have_many отзывы) – Andy

Смежные вопросы