在Rails + RSpec中对String对象使用have_selector

时间:2014-04-15 21:22:29

标签: ruby-on-rails rspec rspec-rails

我在lib /目录中的文件上写了一个规范。 我在那里的一个方法返回一个HTML字符串,但后来我尝试了类似的东西:

expect(subject).to have_selector("p:eq(1)") do |first_p|

它给了我以下错误:

Failure/Error: expect(subject).to have_selector("p:eq(1)") do |first_p|
NoMethodError:
  undefined method `has_selector?' for #<String:0x007f93798a8338>

我该如何解决这个问题?我应该用另一个特定对象包装字符串对象吗?我尝试过使用 Nokogiri :: HTML.fragment(),但它也没有用。我想我应该用一些webrat的对象或类似的东西包装它,但我不知道如何到达那里。提前谢谢。

2 个答案:

答案 0 :(得分:1)

假设您使用Capybara获取has_selector?方法,您需要将结果包装在Capybara.string(...)中以访问has_selector?方法。

所以你的测试应该来自:

expect(subject).to have_selector("p:eq(1)")

要:

result = Capybara.string(subject)
expect(result).to have_selector("p:eq(1)")

文档:http://rdoc.info/gems/capybara/Capybara#string-class_method

答案 1 :(得分:1)

我对使用我之前在此主题中发现的type: :view解决方案感到不满意,尽管它是一个非常有效的解决方案。问题是我的lib/目录中的文件规范实际上不应被视为视图规范。

所以我在互联网上做了一些进一步的研究,发现了一个对我来说更好的方法。

所以考虑一下这个帖子中的原始例子。您只需在describe块中添加以下行:

include Webrat::Matchers

所以最后的例子如下:

describe MyApp::UI::MyDecoratorClass do
  include Webrat::Matchers
  # ...
end