Ruby on rails RSpec&;Rails:Stub@virtual_路径,用于翻译助手测试应用程序助手
我在Ruby on rails RSpec&;Rails:Stub@virtual_路径,用于翻译助手测试应用程序助手,ruby-on-rails,ruby,rspec,rails-i18n,Ruby On Rails,Ruby,Rspec,Rails I18n,我在ApplicationHelper中有一个助手page\u title\u default: def page_title_default(options = {}) t '.title', options end 现在我想这样测试它: describe '#page_title' do subject { page_title } it { ... } end helper.instance_variable_set(:@virtual_path, "admin.path
ApplicationHelper
中有一个助手page\u title\u default
:
def page_title_default(options = {})
t '.title', options
end
现在我想这样测试它:
describe '#page_title' do
subject { page_title }
it { ... }
end
helper.instance_variable_set(:@virtual_path, "admin.path.form")
结束
这将导致以下错误:
Cannot use t(".title") shortcut because path is not available
根据需要,应该可以如下方式存根@virtual_path
变量:
describe '#page_title' do
subject { page_title }
it { ... }
end
helper.instance_variable_set(:@virtual_path, "admin.path.form")
但这似乎没有什么帮助:虽然我可以将其存根,然后在测试中直接调用类似于
helper.t.的东西,但对于page\u title\u default
方法(仍然将@virtual\u path
设置为nil
)中使用的翻译助手,它不起作用。因此,它似乎与translation helper的实例不同。但是我怎样才能找到自己的页面\u标题\u默认方法呢?下面的例子怎么样:
RSpec.describe PageHelper, :type => :helper do
describe "#page_title_default" do
before do
allow(helper).to receive(:t).with(".title", {}) { "Hello!" }
end
subject { helper.page_title_default }
it { is_expected.to eq "Hello!" }
end
end
我们正在删除此处返回的“translated”字符串,以将helper
的规范与“real”翻译分离开来,这对于PageHelper
本身的测试来说可能是脆弱的-每次更改“.title”的翻译时,测试都会失败
另一方面,如果您更改所使用的键,例如从“.title”更改为“.default\u title”,则会失败,因为这是行为的更改
我认为应该在不同的测试级别(具体来说是集成测试)上测试显示的正确文本。请检查以下内容
希望有帮助 这很有效,很好!但是为什么我需要调用显式主题{helper.xxx}
?当只有主题{xxx}
时,它不起作用。第二个代码中的隐式接收器是什么?为什么它和显式的不一样?嘿!这是一个有趣的问题!这是因为该方法将在测试的上下文中调用(在内部,它们是类),因此像这样的调用将导致类似于未定义的局部变量或方法“page\u title\u default”
的错误,这是真的,因为该方法未在测试中实现。如果在descripe
block-def page\u title\u default中定义了该方法,则可以这样使用它;helper.page\u title\u默认结束
。请查一下我的其他电话号码。