stu*_*rtc 1 ruby rspec ruby-on-rails mocha.js rspec2
我最近刚刚将Devise添加到我的第一个Rails3应用程序中,我在控制器测试方面遇到了一些麻烦.
我正在测试User控制器类,它与Devise使用的模型相同.所以在我的规范开头我有这个:
before(:each) do
sign_in @user = Factory.create(:user)
end
Run Code Online (Sandbox Code Playgroud)
现在我可以在不使用模拟或存根的情况下通过测试:
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
Run Code Online (Sandbox Code Playgroud)
但是出于教育目的,我想知道如何让它与模拟和存根一起工作,通常它会完全直接,但似乎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
Run Code Online (Sandbox Code Playgroud)
此外,通过添加twice到期望,这也将失败,因为第一次调用find与我正在设置的期望不同.
任何见解将不胜感激.
您可以使用stubs或者expects像这样指定多个返回值:
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
Run Code Online (Sandbox Code Playgroud)
显然,不同之处在于expects需要知道它将被调用多少次.如果您未指定任何内容,则会假定once并将在后续呼叫中投诉.stubs不在乎.
| 归档时间: |
|
| 查看次数: |
1622 次 |
| 最近记录: |