0

我刚刚开始学习在 Rails 中使用 rspec 进行测试。我有一个用户模型,我正在尝试编写一个测试来让用户登录。以下工作:

describe "user login" do
  let(:user) { FactoryGirl.create(:user) }

  it "logs user in" do
    visit root_path
    click_link "Log In"
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
    click_button "Submit"

    expect(page).to have_content("You are now logged in.")
  end
end

在我的application_controller.rb我有以下方法:

def sign_in(user)
  cookies.permanent[:auth_token] = user.auth_token
  current_user = user
end

helper_method: sign_in

我想知道为什么我的sign_in方法在以下测试中不起作用:

describe "user login2" do
  let(:user) { FactoryGirl.create(:user) }

  it "logs user in" do
    sign_in(user)

    expect(page).to have_content("You are now logged in.")
  end
end

我收到以下错误:Failure/Error: sign_in(user) NoMethodError: undefined method 'sign_in'

4

1 回答 1

0

集成测试背后的想法是您以与普通用户相同的方式与界面交互。这就是您在使用 Capybara 的第一个测试中所做的。

在第二个测试中,您可能必须先包含控制器代码,然后才能调用辅助方法。但是测试仍然不起作用,因为您尝试测试页面上是否显示了某些内容,尽管您还没有调用访问。

如果你想编写集成测试,你应该使用第一个测试。

如果您想编写更多较低级别的测试,您可以直接从控制器登录用户,但您必须以不同的方式验证它。通过控制器/模型中的某些属性或直接来自数据库的某些属性。

于 2013-07-25T19:59:24.633 回答