【问题标题】:RSpec & Rails: Stub @virtual_path for translation helper to test an application helperRSpec & Rails:用于翻译助手的存根 @virtual_path 以测试应用程序助手
【发布时间】:2015-03-24 09:46:42
【问题描述】:

我在ApplicationHelper 中有一个助手page_title_default

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' 之类的东西,但它不适用于 page_title_default 中使用的翻译助手方法(仍然将@virtual_path 设置为nil)。所以它似乎不是翻译助手的同一个实例。但是我怎样才能找到page_title_default的方法呢?

【问题讨论】:

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


    【解决方案1】:

    怎么样:

    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”到“.default_title”它应该失败,因为它是行为的改变。

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

    希望有帮助!

    【讨论】:

    • 这行得通,很好!但是为什么我需要显式调用subject { helper.xxx }?当只有subject { xxx } 时,它不起作用。第二个代码中的隐式接收器是什么?为什么和显式的不一样?
    • 嘿!这是一个有趣的问题!这是因为该方法将在您的测试上下文中调用(在内部,它们是类),因此这样的调用最终会出现类似于 undefined local variable or method 'page_title_default' 的错误 - 这是真的,因为此方法未在您的测试中实现。如果您在 describe 块 - def page_title_default; helper.page_title_default end 中定义了该方法,则可以这样使用它。请查看我的其他answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多