使用Rspec隔离测试细胞 - 任何建议?

时间:2015-01-29 22:06:06

标签: ruby-on-rails rspec rails-cells trailblazer

我正在尝试Apotonick的Trailblazer宝石,它在Rails上带来了更多的结构,我真的很喜欢我到目前为止尝试过的东西,但还没有接受所有这些。这是Trailblazer的一个优势,你可以逐步深入研究它,将它逐步引入你的Rails项目。我买了一本开拓者书,我现在正在关注这本书,这引出了我的问题。

我正在研究示例应用程序(@see https://github.com/apotonick/gemgem-trbrb),但我正在使用rspec。

我想单独测试单元输出。在本书中,测试框架是Test :: Unit,一些辅助方法附带了Test :: Unit的单元格。

使用rspec这是另一个故事......我尝试了rspec-cells,但它似乎不适用于在Trailblazer中使用的当前单元版本(4.0)。 所以我尝试做一些鲑鱼编码,目标是尽可能小的设置来检索细胞的输出。这导致了一个带有简单助手的模块

这是代码(也在这里:https://github.com/demental/gemgem-trbrb/blob/3ec9df1d5f45b880f834486da3c150d4b65ec627/spec/support/cells.rb

module Cell
  module Rspec
    private
    def concept(name, *args)
      controller_stub = double(
        url_options: {
          host: '',
          optional_port: 80,
          protocol: 'http',
          path_parameters: ''
        }
      )
      Capybara.string(Cell::Concept.cell name, controller_stub, *args)
    end
  end
end

RSpec.configure do |config|
  config.include Cell::Rspec, type: :cell
end

我需要创建一个存根url_options方法的原因是pathHelpers方法在单元视图中工作,而不必设置一个完整的控制器(带有一个完整的请求对象)。

我喜欢它的方式,它使一个非常简约的设置。但是我想知道它是不是因为我只是模仿一个控制器,但是我觉得我没有摆脱它的依赖。你觉得怎么样?

1 个答案:

答案 0 :(得分:1)

我知道这篇文章很旧,但我发现你的代码中仍然没有解决问题。

您需要将控制器添加到单元格方法的第三个参数,因为单元格中的第二个参数是模型,第三个参数是选项。你可以这样做:

controller_stub = double(
  url_options: {
    host: '',
    optional_port: 80,
    protocol: 'http',
    path_parameters: ''
  }
)
args[1] = {} if args.length < 2
args[1].merge! controller: controller_stub
Capybara.string(Cell::Concept.cell(name, *args).to_s)

方法 Cell :: Concept.cell 只是 ViewModel.cell 的包装,当您查看此方法时,您可以看到它将控制器添加到options参数:

def cell(name, model=nil, options={})
  ViewModel.cell(name, model, options.merge(controller: parent_controller))
end

并且更深入的parent_controller在ViewModel类中定义并在构造函数中初始化:

def initialize(model=nil, options={})
  @parent_controller = options[:controller]

  setup!(model, options)
end
attr_reader :parent_controller

我希望这会对你有所帮助。