我正在尝试Apotonick的Trailblazer宝石,它在Rails上带来了更多的结构,我真的很喜欢我到目前为止尝试过的东西,但还没有接受所有这些。这是Trailblazer的一个优势,你可以逐步深入研究它,将它逐步引入你的Rails项目。我买了一本开拓者书,我现在正在关注这本书,这引出了我的问题。
我正在研究示例应用程序(@see https://github.com/apotonick/gemgem-trbrb),但我正在使用rspec。
我想单独测试单元输出。在本书中,测试框架是Test :: Unit,一些辅助方法附带了Test :: Unit的单元格。
使用rspec这是另一个故事......我尝试了rspec-cells,但它似乎不适用于在Trailblazer中使用的当前单元版本(4.0)。 所以我尝试做一些鲑鱼编码,目标是尽可能小的设置来检索细胞的输出。这导致了一个带有简单助手的模块
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方法在单元视图中工作,而不必设置一个完整的控制器(带有一个完整的请求对象)。
我喜欢它的方式,它使一个非常简约的设置。但是我想知道它是不是因为我只是模仿一个控制器,但是我觉得我没有摆脱它的依赖。你觉得怎么样?
答案 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
我希望这会对你有所帮助。