我可能在这里咆哮错误的树,但我正在尝试为 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/