0

Jasmineを使用して(jasmine-headless-webkit経由で)いくつかのbackbone.jsビューをテストしようとしています。テスト中にhaml-jsテンプレートにアクセスできないことを除いて、すべてが正常に機能しています。

私の見解では、次のコードは正常に機能します。

render: =>
  html = JST['views/avia_view_template']()
  $(@el).html(html)

...しかし、Jasmine仕様の一部として実行すると、次のエラーが発生します。

ReferenceError: Can't find variable: JST in /home/duncan/avia/app/assets/javascripts/views/avia_view.js.coffee

で何か間違ったことをしているのではないかと思いjasmine.ymlます。テンプレートファイルを明示的に含めましたが、それでも失敗します。

src_files:
  - "vendor/**/*.{js,coffee}"
  - "lib/**/*.{js,coffee}"
  - app/assets/javascripts/application.js
  - app/assets/javascripts/avia.js
  - app/assets/javascripts/jquery-1.6.4.js
  - app/assets/javascripts/underscore.js
  - app/assets/javascripts/backbone.js
  - app/assets/javascripts/jquery.jqGrid.min.js
  - app/assets/javascripts/views/avia_view_template.jst.hamljs
  - app/assets/javascripts/views/avia_view.js.coffee

おそらく私はここで間違ったアプローチを取っているだけです...Jasmineを使用してJSTとjQueryへの呼び出しをスタブ&モックアウトする必要がありますか?厳密に単体テストのアプローチでは、私がすべきだと言っています。その場合、テンプレートへのアクセスがないことは問題ではありません。

テストへの私のアプローチ、または特定のJSTの失敗に関するヒントは、大歓迎です。

4

1 に答える 1

2

スタブを作成する必要はありません。アセット パスを正しく設定するだけで済みます。0.8.0 以降で Sprockets の統合を利用するには、jasmine.yml ファイルを設定する最良の方法は次のようになります。

src_dir: app/assets/javascripts
asset_paths:
- lib/assets/javascripts
src_files:
- "**/*"

app/assets/javascriptsこれにより、Sprockets がとを検索するように設定されlib/assets/javascripts、jasmine-headless-webkit に両方のディレクトリで可能なすべてのファイルをプルするように指示されます。Jasmine が必要とする通常のファイルは、この場合は使用されず、Sprockets のみが使用されます。

require次に、 JS ファイルで通常行うようにステートメントを設定します。したがって、「application.js.coffee」では次のようになります。

#= require jquery-1.6.4
#= require avia
#= require underscore
#= require backbone
#= require jquery.jqGrid.min
#= require_tree .

alert "Look, Internet codes!"

そしてでavia_view.js.coffee

#= require views/avia_view_template.jst.hamljs

class window.AviaView extends Backbone.View
  template: JST['views/avia_view_template']
  ... code ...

もちろん、.hamljsSprockets 対応の Haml プロセッサが読み込まれていない限り、これらのテンプレートは読み込まれません。したがって、少なくともこれを含む Gemfile が必要です。

gem 'jasmine-headless-webkit'
gem 'haml-sprockets'
# also bring in backbone and jquery
gem 'jquery-rails'
gem 'backbone-rails'

次に、これらのベンダーの JS gem がロードされたときにアプリケーション自体が何をすべきかを知っている場合、jQuery と Backbone の独自のコピーを取り除くことができ、.hamljsテンプレートも利用できるようになります。その時点で、Bundler を使用して実行する必要があります。

bundle exec jasmine-headless-webkit

最後に、すべてが実際にロードされていることを確認する最善の方法は、list オプションを使用することです。

bundle exec jasmine-headless-webkit -l

これにより、JHW と Sprockets のファイル ローダーを介してすべてが実行され、含まれるファイルの順序が出力されます。require1 つのシナリオで常に Jasmine スタイルと Sprockets スタイルの両方の読み込みを処理する必要があるため、これは問題の診断に役立ちます。src ファイルを Sprockets 経由で完全にロードするように設定すると、プロセスが大幅に簡素化されるため、このような設定をお勧めします。

于 2011-12-05T13:54:49.400 に答える