0

Ruby、Rails 和 TDD 的新手。我将 RSpec 与 Capybara 和 Capybara webkit 一起使用。

尝试测试页面上是否存在 div 元素。

测试代码:

require 'spec_helper'
describe "Login module" do

    before do 
        visit root_path
    end

    it "should have a module container with id mLogin" do
        page.should have_css('div#mLogin')
    end

    it "should have a module container with id mLogin", :js => true do
        page.evaluate_script('$("div#mLogin").attr("id")').should eq "mLogin"
    end

end

第一个测试通过但第二个测试失败:

Login module should have a module container with id mLogin
     Failure/Error: page.evaluate_script('$("div#mLogin").attr("id")').should eq "mLogin"

       expected: "mLogin"
            got: nil

在浏览器开发工具中运行 JS 并获得“mLogin”而不是 nil。

有任何想法吗?谢谢。

4

2 回答 2

0

一个可能的问题是have_css匹配器支持 Capybara 的同步功能。如果没有立即找到选择器,它将等待并重试,直到找到或超时。

在http://rubydoc.info/github/jnicklas/capybara#Asynchronous_JavaScript__Ajax_and_friends_上有更多关于此的文档

另一方面,evaluate_script立即运行。由于这是您在访问页面后要做的第一件事,因此存在竞争条件:它可能在页面完成加载之前执行此脚本。

您可以通过尝试在页面上找到一个元素来解决此问题,该元素在调用evaluate_script.

或者,您可以将调用包装在调用中synchronize以显式重试,但通常不建议这样做。对于这种情况,最好使用 Capybara 的内置匹配器。evaluate_script仅当没有内置方法来完成您需要做的事情时,该方法才应作为最后的手段使用,并且您需要非常小心以避免竞争条件。

于 2013-04-29T11:05:12.677 回答
0
find('div#mLogin')[:id].should eq 'mLogin'

从文档中看到这个:

#evaluate_script
Evaluate the given JavaScript and return the result. Be careful when using this with scripts that return complex objects, such as jQuery statements. execute_script might be a better alternative.

据我所知,evaluate_script 总是返回 nil。

无论如何,您的第二次测试似乎是测试水豚是否有效,因为您的第一次测试就足够了。

于 2013-04-27T10:46:42.617 回答