4

我正在尝试进行我的第一次水豚测试。我遵循 Ryan Bate 的理念并将一些功能测试放入我的控制器规范文件中。

describe UsersController do
  render_views

  it "can get the home page" do
    get 'home'
    response.body.should include("Login")
  end

  it "should log in" do
    get 'home'
    puts response.body
    click_link('Login')
    response.body.should include("Email")
    response.body.should include("Password")
  end

end

在它应该登录时我遇到了问题,所以开始尝试确保我可以找到并单击链接。没运气。在上面的测试中,我只是想确保链接存在

产生以下puts response.body输出

...
  <div id="user_nav">
      <a href="/users/sign_up">Register</a> or <a href="/users/sign_in" id="Login">Login</a>
  </div>
...

而且我还在实际页面上看到了该元素。似乎只有我的测试找不到它。第一个测试确实通过了。

 1) UsersController should log in
     Failure/Error: click_link('Login')
     Capybara::ElementNotFound:
       no link with title, id or text 'Login' found
     # (eval):2:in `click_link'
     # ./spec/controllers/users_controller_spec.rb:14:in `block (2 levels) in <top (required)>'

我正在使用 Rails 3.2、Rpsec 2.11 和 Capybara 1.1.2。

(我已经检查了有关 stackoverflow 的其他问题以及一些教程和截屏视频。我看不出它找不到给定 id 标签的元素的任何原因,但我可能遗漏了一些明显的东西。

4

1 回答 1

9

我认为它不起作用的原因是您正在使用get本质上是集成测试的东西。看到这篇文章:http ://blog.plataformatec.com.br/2012/06/improving-the-integration-between-capybara-and-rspec/

如果我的理解是正确的,你需要使用visit才能click_link在页面上使用:

it "should log in" do
  visit home_path
  click_link('Login')
  page.should ...
end

另请参阅关于 SO 的答案:Rspec and capybara, difference between visit and get methods, about the current_path object

于 2012-08-29T02:00:08.380 回答