2014-07-14 67 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 

我可以看到這裏發生了什麼(我認爲),像':new'這樣的東西是控制器的動作是對的嗎?

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

它們是模型上的類或實例方法。讓我們只是說在你的例子中的模型變量設置爲狗模型,這是測試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 

現在我想測試什麼在我的控制器怎麼回事,但我要考什麼,我的模型實際執行。我正在隔離要測試的代碼單元。這與測試所有工作如何集成在一起(谷歌單元測試或集成測試)不同。

爲了測試我的控制器中發生了什麼,我將存在於我的模型上的方法存根以保持事物的隔離和清潔。我這樣做的方式是通過在我的控制器規範中對其進行保存。所以在我DogControllerSpec我做的:

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

所以我說:讓我的狗類接收「其中」方法調用,但不執行它的邏輯,而是返回了我一個空數組。

然後我可以設置代碼,我實際上測試這是我的銷燬方法呈現新的時候調用。

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

的關鍵在這裏真的是你正試圖分離你的測試,這樣當你單元測試你DogController#destroy你是不是測試你的Dog.where方法。理由是如果你改變你的Dog模型中的代碼,它不應該破壞你的DogControllerSpec中的規格。

0

他們使用的符號#to_proc,我相信,以「存根」調用模型的方法#WHERE。這意味着行: allow(model).to receive(:where).and_return(no_instances) 本質上是 model.where #=> []

:new是一個控制器動作,但是這種代碼使用它的方式更像SomeClass.new,即創建類(它是模型)的實例的方法。