2010-07-28 48 views
1

我最近剛剛將Devise添加到了我的第一個Rails3應用程序中,而且我在控制器測試中遇到了一些問題。用嘲諷測試兩種不同的期望

我正在測試用戶控制器類,它與Devise使用的是同一個模型。因此,在我的規範的開始,我有這樣的:

before(:each) do 
    sign_in @user = Factory.create(:user) 
end 

現在我可以得到測試通過,而無需使用嘲諷或磕碰,像這樣:

describe "GET edit" do 
    it "assigns the requested user as @user" do 
    user = Factory(:user) 
    get :edit, :id => user.id 
    assigns(:user).should eql(user) 
    end 
end 

但對於教育目的,我想知道如何爲了讓它與嘲笑和殘片一起工作,通常它會是直截了當的,但似乎Devise在控制器操作之前調用User.find,並使測試失敗。

describe "GET edit" do 
    it "assigns the requested user as @user" do 
    user = Factory(:user) 
    User.expects(:find).with(:first, :conditions => {:id => 37}).returns(user) 
    get :edit, :id => '37' 
    assigns(:user).should be(user) 
    end 
end 

還通過將twice到預期這也將失敗,因爲在第一次調用發現是一個我設定的預期不同。

任何有識之士將不勝感激。

回答

5

你可以像這樣指定與任何stubsexpects多個返回值:

require 'test/unit' 
require 'mocha' 

class Foo 
end 

class FooTest < Test::Unit::TestCase 

    # This passes! 
    def test_multiple_returns_with_stubs 
    Foo.stubs(:find).returns('a').returns('b').returns('c') 

    assert_equal('a', Foo.find('z')) 
    assert_equal('b', Foo.find('y')) 
    assert_equal('c', Foo.find('x')) 
    end 

    # This passes too! 
    def test_multiple_returns_with_expects 
    Foo.expects(:find).times(1..3).returns('a').returns('b').returns('c') 

    assert_equal('a', Foo.find('z')) 
    assert_equal('b', Foo.find('y')) 
    assert_equal('c', Foo.find('x')) 
    end 
end 

的區別,顯然,是expects需要知道它是怎麼回事了多少次被調用。如果您未指定任何內容,則會假定爲once,並且會在隨後的調用中投訴。 stubs不在乎。

+0

非常感謝,我得出了類似的結論。對於不同的調用有不同的'.with'有什麼解決辦法嗎?我想另一種解決方法是將Devise的地獄存根出來...... – stuartc 2010-07-30 08:37:13