RSpec 和 Rails:存根 @virtual_path 用于翻译助手以测试应用程序助手

Jos*_*eim 3 ruby rspec ruby-on-rails rails-i18n

我有一个助手page_title_defaultApplicationHelper

def page_title_default(options = {})
  t '.title', options
end
Run Code Online (Sandbox Code Playgroud)

现在我想像这样测试它:

describe '#page_title' do
  subject { page_title }

  it { ... }
end
Run Code Online (Sandbox Code Playgroud)

结尾

这会导致以下错误:

Cannot use t(".title") shortcut because path is not available
Run Code Online (Sandbox Code Playgroud)

根据这篇文章,应该可以@virtual_path像这样存根变量:

helper.instance_variable_set(:@virtual_path, "admin.path.form")
Run Code Online (Sandbox Code Playgroud)

但这似乎没有帮助:虽然我能够存根它然后helper.t '.something'在测试中直接调用类似的东西,但它不适用于page_title_default方法中使用的翻译助手(仍然@virtual_path设置为nil)。所以它似乎不是翻译助手的同一个实例。但是我怎样才能找到page_title_default方法呢?

Paw*_*zak 5

怎么样:

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
Run Code Online (Sandbox Code Playgroud)

我们正在对此处返回的“翻译”字符串进行存根处理,以将规范helper与“真实”翻译分离,这对于PageHelper自身的测试来说似乎很脆弱——每次更改“.title”的翻译时,测试都会失败。

另一方面 - 如果您更改使用的密钥,例如。从“.title”到“.default_title”它应该失败,因为它是行为的改变。

我认为应该在不同级别的测试(具体来说是集成测试)上测试显示的正确文本。请检查以下答案

希望有帮助!