2013-05-14 2 views
3

컨트롤러 작성 작업을 통해 새 블로그 게시물을 만들고 게시물이 성공적으로 저장되면 추가 방법을 실행합니다.RSpec에서 컨트롤러에서 작성 작업을 호출하는 방법

내가 만들고 싶은 게시물에 대한 매개 변수가있는 별도의 공장 소녀 파일이 있습니다. FactoryGirl.create는 내 컨트롤러의 create 액션이 아니라 ruby ​​create 메소드를 호출합니다.

RSpec의 컨트롤러에서 작성 작업을 호출하려면 어떻게해야합니까? 그리고 어떻게 내 공장 여자 패러미터를 보내겠습니까 factories.rb 파일?

posts_controller.rb

def create 
    @post = Post.new(params[:post]) 
    if @post.save 
    @post.my_special_method 
    redirect_to root_path 
    else 
    redirect_to new_path 
    end 
end 

사양/요청/post_pages_spec.rb

it "should successfully run my special method" do 
    @post = FactoryGirl.create(:post) 
    @post.user.different_models.count.should == 1 
end 

post.rb

def my_special_method 
    user = self.user 
    special_post = Post.where("group_id IN (?) AND user_id IN (?)", 1, user.id) 
    if special_post.count == 10 
    DifferentModel.create(user_id: user.id, foo_id: foobar.id) 
    end 
end 

end

+0

FactoryGirl이 무엇인지에 대해 조금 혼란 스럽습니다. 데이터베이스에서 데이터를 생성하기위한 것이지 컨트롤러 작업을 호출하는 것이 아닙니다. 그리고'post_pages_spec.rb'에서 여러분이 묘사 한 것은 실제 요청 사양이 아닌 Post 모델의 단위 테스트와 같습니다. 컨트롤러 액션을 명시 적으로 호출하는 것은 컨트롤러 사양에서만 수행되며 이렇게 수행됩니다. https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/controller-specs – sevenseacat

+0

감사합니다 sevenseacat. 명확성을 위해'my_special_method'에 대한 정의를 추가했습니다. 보시다시피,이 메소드는 데이터베이스에 저장된'special_posts '의 수를 센다. 9 개의 이전 게시물을 작성하는 rspec에 이전 블록이 있습니다. 나는 10 번째 게시물이 새로운'differentmodel' 객체를 생성하도록합니다. – umezo

+0

다시 요청 사양이 아닙니다. 명시 적으로 컨트롤러 동작을 호출하는 것은 컨트롤러 사양뿐입니다. – sevenseacat

답변

4

요청 사양은 Capybara와 같은 것을 사용하여 사용자가 직접 페이지를 방문하고 작업을 수행하는 통합 테스트입니다. 요청 사양에 따라 create 작업을 테스트하지 않을 것입니다. 새 항목 경로를 방문하고 양식을 채우고 제출 단추를 누른 다음 개체가 만들어 졌는지 확인합니다. 훌륭한 예를 보려면 Railscast on request specs을보십시오.

작성 작업을 테스트하려면 컨트롤러 사양을 사용하십시오. FactoryGirl을 통합하면 다음과 같이 나타납니다.

it "creates a post" do 
    post_attributes = FactoryGirl.attributes_for(:post) 
    post :create, post: post_attributes 
    response.should redirect_to(root_path) 
    Post.last.some_attribute.should == post_attributes[:some_attribute] 
    # more lines like above, or just remove `:id` from 
    # `Post.last.attributes` and compare the hashes. 
end 

it "displays new on create failure" do 
    post :create, post: { some_attribute: "some value that doesn't save" } 
    response.should redirect_to(new_post_path) 
    flash[:error].should include("some error message") 
end 

이 테스트는 제작과 관련하여 실제로 필요한 유일한 테스트입니다. 귀하의 구체적인 예를 들어, 나는 적절한 DifferentModel 레코드가 생성되었는지 확인하기 위해 세 번째 테스트 (다시, 컨트롤러 테스트)를 추가합니다.

+0

짐 감사합니다, 이것은 완벽합니다. 그런데, 나는 vote_post_path (post, type : "like")의 경로로 투표 액션을 테스트하려고한다. 내가 어떻게 그럴 수 있니? 나는 post : vote, post : my_post, type : "like"와 같은 것을 시도했지만, 이것은 '경로 일치 없음 {: post => "391", : type => "like", : controller => "post", : action => "vote"}' 레이크 루트는 'vote_post POST/posts/: id/vote (. : format)' – umezo

+0

을 알아 차리고 알아 냈습니다. 'post : 투표, id : my_post.id, type : 'like''는 정상적으로 작동했습니다. 도와 줘서 고마워. – umezo

관련 문제