ruby-on-rails - 为 View 规范中的链接创建一个shoulda匹配器

标签 ruby-on-rails rspec shoulda

我可能在这里咆哮错误的树,但我正在尝试为 Rails View 规范构建一个 shoulda 匹配器。

现在我有一个看起来像这样的 View 规范:

require 'rails_helper'

RSpec.describe 'layouts/_navigation', :type => :view do

  context 'everyone' do
    before :each do
      allow(view).to receive(:user_signed_in?).and_return(false)
      render
    end  

    it 'shows links to start reading' do
      expect(rendered).to have_link(I18n.t(:start_reading), :href => stories_path)
    end

    it 'shows links to home page' do
      expect(rendered).to have_link(I18n.t(:unknown_tales), root_path)
    end
  end
end

我希望能够用这样的东西替换它:

require 'rails_helper'

RSpec.describe 'layouts/_navigation', :type => :view do

  context 'everyone' do
    before :each do
      allow(view).to receive(:user_signed_in?).and_return(false)
      render
    end  


    it {should have_valid_link(I18n.t(:start_reading), stories_path)}
    it {should have_valid_link(I18n.t(:unknown_tales), root_path)}
  end
end

我已经尝试过以下方法,但它不起作用:

RSpec::Matchers.define :have_valid_link do |title, path|
  description { "have valid link to #{path} on #{title}" }

  match do |rendered|
    expect(rendered).to have_link(title, :href => path)
  end

end

我不确定这是否不起作用,因为我做错了,或者是否应该匹配器从未被设计为与 View 一起使用。

谢谢

最佳答案

我对这个答案并不完全有信心,因为可能有其他/更简单的方法来解决这个问题,但这是我的理解:

  • 我认为您在这里寻找的只是一个常规的 RSpec“匹配器”。 shoulda 是一个包含一组特定匹配器的 gem。

  • 您需要通过 subject 显式或隐式地将 rendered 传递给匹配器。

  • 您的匹配器需要将渲染的字符串转换为 capybara 节点才能使用 capybara 匹配器,例如通过 Capybara.string

  • match 方法预计返回一个 bool 值,而不是调用 expect

综合起来,这给你:

require 'rails_helper'

RSpec::Matchers.define :have_valid_link do |title, path|
  description { "have valid link to #{path} on #{title}" }

  match do |rendered|
    Capybara.string(rendered).has_link?(title, :href => path)
  end
end

RSpec.describe 'layouts/_navigation', :type => :view do
  context 'everyone' do
    subject { rendered }

    before :each do
      allow(view).to receive(:user_signed_in?).and_return(false)
      render
    end  

    it {should have_valid_link(I18n.t(:start_reading), stories_path)}
    it {should have_valid_link(I18n.t(:unknown_tales), root_path)}
  end
end

关于ruby-on-rails - 为 View 规范中的链接创建一个shoulda匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27642481/

相关文章:

ruby-on-rails - Newrelic 导致在每个请求上生成更新的 etag

ruby-on-rails - 搜查、搜索多列、一个字段、rails 3

ruby-on-rails - 测试类级别方法是否更改另一个类的属性

ruby-on-rails - Ruby on Rails RSpec 错误:Encoding::UndefinedConversionErrors

ruby-on-rails - 如何更改 shoulda 匹配器的主题

ruby-on-rails - 开发难度为 "levels"的 RoR 应用程序

ruby-on-rails - RSpec 失败 - 日期比较

ruby-on-rails - Rails 4/验证 - 数值 : { only_integer: true } necessary on 'integer' attribute?

ruby-on-rails - 在 Rails 中如何测试模型是否具有给定的方法?

ruby-on-rails - Ruby 时间运行 block 休眠 x 秒