2

私が構築しているプロジェクトのためにrequireJSに移行し始めています。私は現在jasminerice、rails 3.2、およびrequire-rails gemを使用しています。

http://ryantownsend.co.uk/post/31662285280/jasminerice-and-requirejs-rails-fixを実装しようとしましたが 、ほとんど成功しませんでした。仕様はまったく実行されません。

私は、requirejsを単独で使用する方が良いのではないか、それともジャスミンの宝石を使用する方が良いのではないかと考え始めていますか?

私はジャスミンライスまたはrequire-rails gemのどちらにも販売されていないので、最高のツールに関するアドバイス、およびそれを起動して実行する方法/優れたチュートリアルに関するヒントはありますか?

4

2 に答える 2

2

私は同じ設定をしています。これが私がやったことです(元の質問で言及されたブログ投稿から始めて):

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 つのヒント: モジュールが変更されてもブラウザーがモジュールをリロードしないために問題が発生した場合は、ブラウザーが常に新しいファイルを認識して正しくロードできるように、タイムスタンプ付きのダミー引数を追加するというトリックを使用します。

ApplicationControllerbefore フィルターをロードするこの関数を作成しました。

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 に配置する必要があります。

この構成を使用している他の人にヒントを提供できることを願っています!

于 2013-09-22T14:53:15.007 に答える
2

応答がなかったので、少しハックな方法で機能させることができました。

ビュー フォルダー jasminerice/spec/index.html.erb (または haml) にファイルを作成し、jasminerice gem から html をコピーする場合。spec.js 呼び出しを次のように置き換えます。

%script{"data-main"=>"/assets/#{@specenv}", src:"/assets/require.js"}

次に、require template のように spec ファイルを次のように記述します。

require.config {
  paths:{
    'jquery':'/assets/jquery'
    'underscore': '/assets/underscore-min'
    'sinon':'sinon-1.6.0'
    'jasmine-sinon':'jasmine-sinon'
    'my_js':'my_js'
    'my_spec':'my_spec'
  }
}


require ['sinon', 'jasmine-sinon', 'jquery', 'underscore', 'my_js', 'my_spec'], () ->
  jasmine.getEnv().execute()

これにより、ジャスミンライスがテストをトリガーするのを防ぐことができます

jasmine.rice.autoExecute = false

これに似た beforeFilter を使用してテストをセットアップします ( http://kilon.org/blog/2012/08/testing-backbone-requirejs-applications-with-jasmine/から取得)

describe "MySpec", ->

  beforeEach ->
    flag = false

    @thing = ""
    that = @

    require ['myjs'], (Myjs) ->
      flag = true
      that.thing = new Myjs()

    waitsFor ->
      flag


  it 'It should exsist', ->
    expect(@thing).toBeDefined()

同様の問題を抱えている人に役立つことを願っています。誰かがより良い解決策を持っている場合は投稿してください! :)

于 2013-06-28T16:11:34.143 に答える