2014-07-14 2 views
0

나는 다른 사람들이 쓴 몇 가지 시험을보고 있는데 나는 시험에서 ':where'을 계속보고있다. 나는 그 스텁을 추측하지만, 테스트로 내 발을 발견하고 그것을 알고 싶다면 정상적인 스텁과 다르다. 명명은 무엇을 의미 하는가?정확히이 rspec 스텁은 무엇입니까?

describe "delete destroy" do 
    context "is not allowed by user" do 
     before do 
     allow(model).to receive(:where).and_return(no_instances) 
     allow(no_instances).to receive(:first).and_return(no_instances) 
     end 
     context "where the record is destroyed" do 
     before do 
      allow(instance).to receive(:destroy).and_return(true) 
      delete :destroy, params_id 
     end 
     sets_flash(:notice) 
     redirects_to('/airbrake_accounts') 
     end 
     context "where the record is not destroyed" do 
     before do 
      allow(instance).to receive(:destroy).and_return(false) 
      delete :destroy, params_id 
     end 
     sets_flash(:error) 
     redirects_to('/airbrake_accounts') 
     end 
    end 
    context "where the record is not found" do 
     before do 
     allow(model).to receive(:where).and_return(no_instances) 
     delete :destroy, params_id 
     end 
     sets_flash(:error) 
     redirects_to('/airbrake_accounts') 
    end 
    end 

나는 여기에서 무슨 일이 일어나고 있는지 (나는 생각한다.) '새로운 :'과 같은 것들이 바로 컨트롤러 동작인가?

describe "photo create" do 
    before do 
     allow(model).to receive(:new).and_return(instance) 
    end 
    context "where all is not well" do 
     before do 
     allow(instance).to receive(:save).and_return(false) 
     post :create, params_new_instance 
     end 
     sets_flash(:error) 
     it "should render the new form" do 
     expect(response).to render_template("entries/new") 
     end 
    end 
    context "where all is well" do 
     before do 
     allow(instance).to receive(:save).and_return(true) 
     post :create, params_new_photo 
     end 
     sets_flash(:notice) 
     redirects_to ('/photos') 
    end 
    end 

답변

1

모델의 클래스 또는 인스턴스 메소드입니다. 귀하의 예제에서 모델 변수가 Dog 모델로 설정되어 있고 이것이 DogController를 테스트하고 있다고 가정 해 보겠습니다.

# model 
class Dog 
    def where(params) 
    do_stuff 
    end 
end 

# controller 
class DogController > ApplicationController 
    def destroy 
    @dogs = Dog.where(id: 1) 
    redirect :new 
    end 
end 

지금 내 컨트롤러에서 무슨 무슨 테스트 할,하지만 난하지 내 모델이 실제로 않는 것을 테스트 할 할 . 나는 테스트 할 코드의 단위를 분리하고있다. 이것은 모든 것이 어떻게 통합되어 작동하는지 테스트하는 것과는 다릅니다 (Google 단위 테스트 또는 통합 테스트).

내 컨트롤러에서 무슨 일이 일어나는지 테스트하기 위해 내 모델에서 일어나는 방법을 스터브하여 격리되고 깨끗하게 유지합니다. 내가하는 일은 내 컨트롤러 스펙에서 스터 빙하는 것입니다. 그래서 내 DogControllerSpec에서 나는 수행

before do 
    allow(Dog).to receive(:where).and_return([]) 
end 

그래서 나는 내 강아지 클래스는 '어디에'메서드 호출을받을 수 있도록 말하고, 그러나 그것의 논리를 실행하고, 대신 나에게 빈 배열을 반환하지 않습니다.

그럼 내가 실제로 테스트하고있는 코드를 설정할 수 있는데, 이는 내 destroy 메소드가 호출 될 때 새로운 것을 렌더링한다는 것입니다. 여기

it "should render the new form" do 
    expect(response).to render_template("dogs/new") 
end 

열쇠는 당신이 단위 당신의 DogController#destroy 당신이 테스트를하지 않는 당신의 Dog.where 방법을 테스트 할 때, 그래서 테스트를 분리하려고 정말이다. Dog 모델에서 코드를 변경하면 DogControllerSpec의 사양을 벗어나지 않아야합니다.

0

그들은 # of_proc 심볼을 사용하고 있습니다. 모델에서 #where 메소드를 호출하는 '스텁'이라고 생각합니다. 즉, 라인 : allow(model).to receive(:where).and_return(no_instances) 은 본질적으로 model.where #=> []입니다.

:new은 컨트롤러 동작이지만이 코드가 사용하는 방식은 SomeClass.new과 비슷합니다. 즉, 클래스의 인스턴스 (모델)를 만드는 방법입니다.

관련 문제