我可能会在这里咆哮错误的树,但我正在尝试为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
我不确定这是否有效,因为我做错了,或者是否应该将匹配器用于视图。
由于
答案 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