在视图规范中为链接创建一个shoulda匹配器

时间:2014-12-24 21:54:54

标签: ruby-on-rails rspec shoulda

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

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

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

我不确定这是否有效,因为我做错了,或者是否应该将匹配器用于视图。

由于

1 个答案:

答案 0 :(得分:1)

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

  • 我认为这只是一个普通的RSpec“匹配器”,你在这里寻找。 shoulda是一个包含一组特定匹配器的宝石。

  • 您需要通过rendered明确或隐含地将subject传递给您的匹配器。

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

  • match方法应返回布尔值,而不是调用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