RSpec& Rails:Stub @virtual_path用于翻译助手以测试应用程序助手

时间:2015-03-24 09:46:43

标签: ruby-on-rails ruby rspec rails-i18n

我在page_title_default中有一个帮助ApplicationHelper

def page_title_default(options = {})
  t '.title', options
end

现在我想像这样测试它:

describe '#page_title' do
  subject { page_title }

  it { ... }
end

这会导致以下错误:

Cannot use t(".title") shortcut because path is not available

根据this post,应该可以将@virtual_path变量存根,如下所示:

helper.instance_variable_set(:@virtual_path, "admin.path.form")

但这似乎没有帮助:虽然我能够将其存根,然后在测试中直接调用类似helper.t '.something'的内容,但它对于{中使用的翻译帮助程序不起作用{1}}方法(仍将page_title_default设置为@virtual_path)。所以它似乎与翻译助手的实例不同。但是我怎样才能找到nil方法?

1 个答案:

答案 0 :(得分:3)

如下:

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

我们正在抄袭"翻译"这里返回的字符串是为了将helper的规格从"真实"翻译,对于PageHelper本身的测试来说可能看起来很脆弱 - 每次更改" .title"的翻译时测试都会失败。

另一方面 - 如果您更改使用的密钥,例如。来自" .title" to" .default_title"它应该失败,因为它是行为的改变。

我认为显示的正确文本应该在不同的测试级别上进行测试(集成测试,具体而言)。请检查以下answer

希望有所帮助!