Rspec帮助程序测试需要访问控制器方法

时间:2012-03-15 05:47:14

标签: ruby-on-rails rspec devise

我有一个帮助方法的Rspec测试,需要访问Devise提供的current_user方法。问题是当我在测试中使用login_user宏来帮助他们时不起作用!

以下是我的测试结果:

describe 'follow_link' do
  before :each do
    login_user
  end

  it "display 'follow' if the curren_user is not following" do
    user = Factory :user
    helper.follow_link(user).should == 'Follow'
  end
end

但它失败了:

Failure/Error: login_user
 NoMethodError:
   undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_2:0x007faf8c680090>
# ./spec/support/macros.rb:4:in `login_user'
# ./spec/helpers/users_helper_spec.rb:29:in `block (3 levels) in <top (required)>'

那个宏看起来像这样:

def login_user
  @user = Factory(:user)
  visit new_user_session_path

  # fill in sign in form
  within("#main_container") do
    fill_in "user[email]", with: @user.email
    fill_in "user[password]", with: @user.password
    click_button "Sign in"
  end
end

我已经要求:

require 'spec_helper'

在我的测试中,除了那种方法之外的所有东西仍然不可用。

3 个答案:

答案 0 :(得分:1)

通常,在这种情况下,我模拟控制器方法:mock(current_user){nil}

答案 1 :(得分:1)

朋友'访问'是Capybara的方法,用于编写集成测试用例。

对于编写RSpec单元测试用例,您需要存根current_user方法调用,并专注于辅助方法的功能。

describe 'follow_link' do
  before :each do
   @user = Factory :user
   helper.stub(:current_user).and_return(@user)
  end

  it "display 'follow' if the curren_user is not following" do
    helper.follow_link(@user).should == 'Follow'
  end
end

答案 2 :(得分:1)

谷歌把我带到了这里,但上面的答案对我没有帮助,经过一番研究后我找到了下面的博客。

我的错误:

NoMethodError:
       undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0xa49a73c>

由于Capybara 2.0必须使用文件夹spec/features,所以capybara命令不再适用于文件夹spec/requests

帮助我的博客: http://alindeman.github.com/2012/11/11/rspec-rails-and-capybara-2.0-what-you-need-to-know.html

希望你觉得这很有用。