-->

RSpec & Rails: Stub @virtual_path for translation

2019-05-30 08:30发布

问题:

I have a helper page_title_default in ApplicationHelper:

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

Now I want to test it like this:

describe '#page_title' do
  subject { page_title }

  it { ... }
end

end

This results in the following error:

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

According to this post it should be possible to stub the @virtual_path variable like this:

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

But this doesn't seem to help: While I am able to stub it and then to call something like helper.t '.something' directly in the test, it doesn't work for the translation helper which is used in the page_title_default method (which still has @virtual_path set to nil). So it seems it's not the same instance of translation helper. But how can I find the page_title_default method one's?

回答1:

How about something like:

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

We're stubbing the "translated" string returned here to decouple the spec of helper from "real" translations, which may appear to be fragile for the test of PageHelper itself - the tests would fail every time you change the translations of ".title".

On the other hand - if you change the key used, eg. from ".title" to ".default_title" it should fail, because it is change of behaviour.

I think the proper text displayed should be tested on different level of test (integration tests, to be specific). Please, check the following answer.

Hope that helps!