2011-09-16 86 views
4

我們在一個rails應用程序的幾乎所有基於表的視圖中都有一個過濾條,我們需要測試控制器的動作。如何測試在RSpec中具有過濾器的搜索控制器操作?

的代碼的一個例子:

def index 
    @users = User. 
    with_status(params[:status]). 
    with_role(params[:role_id]). 
    search(params[:q]) 
end 

上述方法是ActiveRecord的作用域其是設置將被旁路,如果如果空白傳遞的值。

我現在需要做的是三立符合規範,並測試所有ESGE情況:

  • 沒有PARAMS通過
  • 唯一的作用,只有狀態,只搜索
  • 角色+地位,作用+搜索,...(對2)
  • 角色+狀態+搜索

我寫的基本規範示例如下:

context "when filtering by status" do 
    before do 
    1.times { Factory(:user, :status => "one") } 
    3.times { Factory(:user, :status => "other") } 
    end 

    it "returns only users with the provided :status" do 
    get :index, :status => "one" 

    assigns(:users).size.should == 1 
    assigns(:users)[0].status.should == "one" 
    end 
end 

我想編寫一個矩陣,它將混合和匹配角色,狀態和搜索參數並生成適當的規範示例。

數組#排列解決方案還是有更好的方法來做到這一點?

+0

我會通過排列來做到這一點,但我也有興趣看看有人知道更好的方法。 – iain

+0

我只是做了排列組合,儘管我管理了一個很好的線條/規格比(約60條規格的約10條線),但我擔心它的複雜性。 – Kostas

+1

這裏是:https://gist.github.com/1226216 – Kostas

回答

1

我會測試模型中的範圍,因此請確保它們可以正確處理空白值,並正確處理設置值。

然後在控制器內部,我會測試鏈條被調用的期望值(使用stub_chain)。鏈將返回正確結果的事實由每個範圍單獨具有正確行爲(您測試過)的事實來處理,並且通過rails/activerecord確保組合行爲。你應該測試傳遞的參數是否正確處理。

您爲測試矩陣而建立的代碼非常令人印象深刻。但是對於我來說,我試圖確保我的測試是可讀的,我認爲它們是一種文件,說明預期的代碼是什麼。對我來說,你的代碼乍一看是不可理解的。

希望這會有所幫助。

相關問題