4

私は、Apotonick の Trailblazer gem を試しています。これは、Rails の上により多くの構造をもたらします。まだすべてを受け入れていませんが、これまでに試したものが本当に気に入っています。これは Trailblazer の強みの 1 つであり、段階的に掘り下げて、段階的に Rails プロジェクトに取り入れることができます。Trailblazer の本を購入しました。現在それを読んでいますが、それが私の質問につながります。

サンプルアプリ ( @see https://github.com/apotonick/gemgem-tbrrb )に取り組んでいますが、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 メソッドをセル ビューで機能させるためでした。

非常にミニマルなセットアップになるという点で気に入っています。しかし、コントローラーを模倣しているだけなので、あまりにもダミーになっていないかどうか疑問に思っていますが、その依存関係を取り除くことができていないように感じます。どう思いますか ?

4

1 に答える 1

1

この投稿が古いことは承知していますが、コードの問題はまだ解決されていないようです。

cell の 2 番目のパラメーターはモデルで、3 番目のパラメーターはオプションであるため、cell メソッドの 3 番目のパラメーターにコントローラーを追加する必要があります。以下のようにできます。

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

お役に立てば幸いです。

于 2016-01-07T23:54:43.920 に答える