私は同じ設定をしています。これが私がやったことです(元の質問で言及されたブログ投稿から始めて):
1. すべてのスペック ファイルをロードするヘルパーを作成する
ファイルlib/jasminerice/spec_helper.rb
に、次のコードを入れます。
require "requirejs-rails"
module Jasminerice
module SpecHelper
include RequirejsHelper
def spec_files
Rails.application.assets.each_logical_path.select { |lp| lp =~ %r{^spec/.*\.js$} }
end
end
end
これにより、Jasminerice ランナー ビューで呼び出してすべてのスペックを自動的に取得できるヘルパー メソッドが作成されるためspec_files
、新しいスペックを追加するたびにスペックのリストを更新する必要はありません。
2. デフォルトの Jasminerice インデックス ビューをオーバーライドする
app/views/jasminerice/spec/index.html.erb
次の名前のビューを作成します。
<!doctype html>
<head>
<title>Jasmine Spec Runner</title>
<%= stylesheet_link_tag "jasmine", "spec" %>
<%= requirejs_include_tag 'application' %>
<%= javascript_include_tag "jasminerice", "spec", :debug => true %>
<script>
jasmine.rice.autoExecute = false;
require([<%= spec_files.map { |f| "'#{f.sub(/\.js$/,'')}'" }.join(',').html_safe %>],
function() { jasmine.getEnv().execute() },
function(err) {
var failedId = err.requireModules && err.requireModules[0];
requirejs.undef(failedId);
define(failedId, function() { return function() { console.debug(failedId + ': ' + err); null }; });
require([ failedId ], function() {} );
});
</script>
<%= csrf_meta_tags %>
</head>
<body>
</body>
</html>
これには、Jasmine を実行する前にすべての仕様が必要になります ( with jasmine.getEnv().execute()
)。仕様パスの配列を取得し、引用符で囲まれたモジュール名の配列を生成してに渡すという醜いハックがそこにありますrequire
。
モジュールの読み込みに問題がある場合に備えて、エラー コールバックも含めました。これを行わないと、モジュールの読み込みが失敗したときにスペックがハングします。これは、コマンドラインで を介して実行している場合に特に問題になります。guard-jasmine
これは私が行っていることです。
残念ながら、このようなエラーを処理する良い方法が見つかりませんでした。ここではconsole.debug
、失敗したモジュールに情報を書き込んでから、その場所に無名関数を返すよう要求しました。これにより、仕様を実行できますが、予測できない結果が生じます (結果がないよりはましです)。この状況に対処するためのより良い方法を見つけるのに苦労してきました。提案をいただければ幸いです。
3. いくつかの仕様を書く
私の Jasmine 仕様は次の形式を取ります。
define (require) ->
MyModule = require 'my-module'
# any other dependencies needed to test
describe 'MyModule', ->
it 'exists', ->
expect(MyModule).toBeDefined()
など。すべてのテスト依存関係 (jasmine、sinon、jasmine-sinon など) は、require の外部で次のようにロードすることに注意してくださいspec.js.coffee
。
#=require sinon
#=require jasmine-sinon
#=require_tree ./helpers/
必要なその他のヘルパー関数をhelpers
ディレクトリに配置します。
4.ボーナス
もう 1 つのヒント: モジュールが変更されてもブラウザーがモジュールをリロードしないために問題が発生した場合は、ブラウザーが常に新しいファイルを認識して正しくロードできるように、タイムスタンプ付きのダミー引数を追加するというトリックを使用します。
ApplicationController
before フィルターをロードするこの関数を作成しました。
before_filter :set_requirejs_config
def set_requirejs_config
opts = { :urlArgs => "bust=#{Time.now.to_i}" }) if Rails.env == "development"
Requirejs::Rails::Engine.config.requirejs.run_config.merge!(opts)
end
これにより、開発モードの場合は各モジュール名の末尾にクエリ パラメータbust=...
が追加されるため、常にモジュールをリロードして最新バージョンを取得できます。RequireJS でこれを行う方法を説明する SO の投稿がどこかにありますが、requirejs-rails で動作させるconfig/requirejs.yml
には、ページをロードするたびにロードされるように、(ではなく) ApplicationController に配置する必要があります。
この構成を使用している他の人にヒントを提供できることを願っています!