konachaでRailsアプリを作ろうとしています。
$ ruby --version
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]
- レール (3.2.11)
- こなちゃ(2.5.1)
問題は、konacha はテストを見つけることはできますが、テストを実行できないことです。
コードを調べたところ、 という名前konacha.environment
の初期化子が各config.after_initialize
ブロックの後に実行されていることがわかりました。
通常、konacha のテスト ディレクトリは に追加さconfig.assets.paths
れkonacha.environment
、config.after_initialize
でSprockets::Bootstrap
実行され、 に関する処理が実行されassets.paths
ます。しかし、私の環境では順序が逆になっています。つまり、Sprocket は konacha がアセット パスを更新する前にアセット パスをロードします。
さらにイニシャライザを調べたところ、イニシャライザの順序がtsort
. しかし、その後、順序が逆転しました。コードにデバッグ式を埋め込み、実行順序を出力しました。
埋め込まれたデバッグ式:
def run_initializers(group=:default, *args)
return if instance_variable_defined?(:@ran)
initializers.each do |i|
puts "before tsort: [[#{i.after.inspect}]]-> [[#{i.name.inspect}]] ->[[#{i.before.inspect}]]"
end.tsort.each do |i|
puts "after tsort: [[#{i.after.inspect}]]-> [[#{i.name.inspect}]] ->[[#{i.before.inspect}]]"
end.each do |initializer|
initializer.run(*args) if initializer.belongs_to?(group)
end
@ran = true
end
出力:
...
before tsort: [[:append_assets_path]]-> [[:prepend_helpers_path]] ->[[nil]]
before tsort: [[:prepend_helpers_path]]-> [[:load_config_initializers]] ->[[nil]]
before tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
before tsort: [[nil]]-> [["konacha.environment"]] ->[[nil]]
before tsort: [[nil]]-> [[:set_load_path]] ->[[:bootstrap_hook]]
before tsort: [[:set_load_path]]-> [[:set_autoload_paths]] ->[[:bootstrap_hook]]
before tsort: [[:set_autoload_paths]]-> [[:add_routing_paths]] ->[[nil]]
...
before tsort: [[:add_to_prepare_blocks]]-> [[:run_prepare_callbacks]] ->[[nil]]
before tsort: [[:run_prepare_callbacks]]-> [[:eager_load!]] ->[[nil]]
before tsort: [[:eager_load!]]-> [[:finisher_hook]] ->[[nil]]
before tsort: [[:finisher_hook]]-> [[:set_routes_reloader_hook]] ->[[nil]]
before tsort: [[:set_routes_reloader_hook]]-> [[:set_clear_dependencies_hook]] ->[[nil]]
before tsort: [[:set_clear_dependencies_hook]]-> [[:disable_dependency_loading]] ->[[nil]]
...
...
after tsort: [[:define_main_app_helper]]-> [[:add_to_prepare_blocks]] ->[[nil]]
after tsort: [[:add_to_prepare_blocks]]-> [[:run_prepare_callbacks]] ->[[nil]]
after tsort: [[:run_prepare_callbacks]]-> [[:eager_load!]] ->[[nil]]
after tsort: [[:eager_load!]]-> [[:finisher_hook]] ->[[nil]]
after tsort: [[:finisher_hook]]-> [[:set_routes_reloader_hook]] ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]-> [["append marketable routes"]] ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]-> [["add marketable route parts to reserved words"]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[nil]]-> [["konacha.environment"]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[nil]]-> [["static assets"]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[nil]]-> [["register refinerycms_town_story_articles plugin"]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]-> [[:set_clear_dependencies_hook]] ->[[nil]]
after tsort: [[:set_clear_dependencies_hook]]-> [[:disable_dependency_loading]] ->[[nil]]
出力全体はGistにあります。
config.after_initialize
は という名前の初期化子で呼び出されることに注意してください:finisher_hook
。
この問題の回避策も見つけました。次の空の初期化子を定義するだけで、すべて正常に動作します。
initializer "dummy", after: 'konacha.environment', before: :finisher_hook do |app|
end
しかし、誰が問題の責任を負っているのか知りたいです。これはこなちゃんの問題なのか、Railsの問題なのか、それとも私の勘違いなのか。