使用Capybara测试纯JavaScript应用程序

时间:2011-10-16 23:15:38

标签: ruby selenium rspec sinatra capybara

我在使用Sinatra和Capybara时遇到了一些问题。

我想测试一个纯粹的JavaScript应用程序。它只是Sinatra服务的普通index.html。

require "sinatra"

get "/" do
  File.read("public/index.html")
end

比方说,我想测试一下这段代码。

$("a.link").click(function(){
  $(this).replaceWith("New String");
});

<a href="#link" class="link">Click me!</a>

然后测试会看起来像这样。

describe "requests", js: true do    
  it "should display a message" do
    visit "/"
    click_link "Click me!"
    page.should have_content("New String")
  end
end

问题是没有任何反应。根据{{​​3}},如果将js: true添加到describe块,则Firefox应启动并运行测试。

这是我的spec_helper文件。

require "rspec"
require "capybara"
require "capybara/dsl"

Capybara.javascript_driver = :selenium
require_relative "./../server"

Capybara.app               = Sinatra::Application
Capybara.javascript_driver = :selenium
Capybara.default_wait_time = 10

RSpec.configure do |config|
  config.mock_with :rspec
  config.include Capybara
end

这是运行rspec rspec/request_spec.rb时的输出。

requests
  should display a message (FAILED - 1)

Failures:

  1) requests should display a message
     Failure/Error: page.should have_content("New String")
       expected #has_content?("New String") to return true, got false
     # ./spec/request_spec.rb:5:in `block (2 levels) in <top (required)>'

Finished in 4.38 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/request_spec.rb:2 # requests should display a message

我在Github上创建了一个完整的示例项目,可以在这里找到: Ryan Bates screencast

任何人都知道它失败的原因?

1 个答案:

答案 0 :(得分:4)

HereJonas Nicklas的原始答案。

  

你需要'capybara / rspec'并设置:type =&gt; :请求
  请参阅“使用带RSpec的Capybara”的Capybara README部分   /乔纳斯

Here是Github的一个工作示例。