首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rspec隔离测试单元-有什么建议吗?

使用Rspec隔离测试单元-有什么建议吗?
EN

Stack Overflow用户
提问于 2015-01-30 06:06:06
回答 1查看 472关注 0票数 4

我正在尝试Apotonick的Trailblazer gem,它在Rails之上带来了更多的结构,我真的很喜欢我到目前为止所尝试的东西,但还没有接受所有的东西。这是Trailblazer的一个优点,您可以逐步深入研究它,将其逐步引入到您的Rails项目中。我买了“开拓者”这本书,现在我正在读这本书,这就引出了我的问题。

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

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

而rspec则是另一回事。我尝试过rspec-cells,但它似乎不适用于Trailblazer中使用的当前cells版本(4.0)。所以我试着做一些鲑鱼编码,目标是尽可能少的设置来检索单元的输出。这导致了一个具有简单帮助器的模块

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

代码语言:javascript
复制
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方法可以在单元格视图中工作,而不必设置完整的控制器(具有完整的request对象)。

我喜欢它的一种方式,它做了一个非常简约的设置。但是我想知道它是不是变得太虚拟了,因为我只是模仿一个控制器,但我感觉我没有摆脱它的依赖。你觉得呢?

EN

回答 1

Stack Overflow用户

发布于 2016-01-08 07:54:44

我知道这篇文章很老了,但是我看到你的代码中仍然没有解决问题。

您需要在cell方法的第三个参数中添加控制器,因为单元格中的第二个参数是model,第三个参数是options。你可以像下面这样做:

代码语言:javascript
复制
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,参数中:

代码语言:javascript
复制
def cell(name, model=nil, options={})
  ViewModel.cell(name, model, options.merge(controller: parent_controller))
end

更深一层的parent_controller是在ViewModel类中定义的,并在构造函数中初始化:

代码语言:javascript
复制
def initialize(model=nil, options={})
  @parent_controller = options[:controller]

  setup!(model, options)
end
attr_reader :parent_controller

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28225534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档