3

クライアント側のものがcoffeescriptで記述され、require.jsでロードされるWebアプリがあります。

expressoなどのノードベースのテストランナーを使用してこれらを分離してテストできるようにしたいと思います(他の提案も歓迎します)。これにより、クライアント側のテストをCIサーバー(現在はTeam City)と統合できます。

これが私のディレクトリ設定です:

.
├── coffee
│   ├── models
│   ├── node_modules
│   │   └── expresso
│   ├── spec
│   ├── tests
│   └── views
├── static
│   └── js
│       ├── lib
│       ├── models
│       ├── tests
│       └── views

これらは、次のようにrequire.jsを使用して接続されます。

deps = [
   "lib/backbone", "models/websocket_collection", "/static/js/lib/date.js"
]

define(deps, (Backbone, ws) ->
    # module code and exports here

そして、次のようにブラウザにロードされます。

<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="my_mod" src="/static/js/my_mod.js"></script>

アイデアの世界では、次のようなテストモジュールを使用できるようにしたいと考えています。

{Model1, Model2} = require "models/some_module"

exports.test_a = ->
    assert.equal # etc etc

いくつかの問題があります(zombie.jsで遊んだ場合を除いて、ノードサーバー側を実際に使用していません)

  1. プレーンなjavascriptの依存関係がすべて(static / js / lib内で)どこにあるかをノードに伝えるにはどうすればよいですか?これらの一部はダウンロードされたままですが、backbone.jsはrequire.jsでマークアップされています

    define(function(require, exports, module) {
        (function(){
    
  2. 実際にテストを実行するにはどうすればよいですか?私はr.jsを試しました(これは、ブラウザー側のrequireとノードのrequireの間のブリッジであると理解しています)

私が得ている問題は次のとおりです。

ReferenceError: define is not defined

また、すべてのクライアントコードを収集するためにブラウザ側をロードするスクリプトであるrequire( "allplugins-require")を試しましたが、これはノードのrequireを壊しているようです。

  • 誰かこれをやっていますか?
  • これを行っていない場合、コードをどのようにテストしていますか(CIとの統合のボーナスポイント)?
  • サーバー側で少しうまく機能する可能性のあるクライアント側の依存関係を管理するためのrequire.jsの代替手段はありますか?

人々が使用している別のアプローチを聞いてとてもうれしく思います。

ありがとう、ベン

4

3 に答える 3

3

ノードでr.jsを介してrequirejsを実行するためのドキュメントはこちらです。特に、r.jsはノードのrequireを独自のものに置き換えます。npmがインストールされたモジュールがrequire.js構成に表示されない限り、npmを介してインストールされたノードのみのパッケージ/モジュールをロードできます。

もう1つの注意点は、r.jsは、ノード環境で実行される最上位のアプリjsファイルであるmain.jsの兄弟ファイルである必要があるということです。

r.jsの最新のコードは、requirejsをノードモジュールとしてロードすることをサポートし(require('requirejs')のように)、より良い統合ストーリーを提供します。その変更は0.26.0リリースで行われます。

于 2011-08-14T07:38:37.077 に答える
2

私はこれを機能させるために長い時間を費やし、最終的にはあきらめました。グローバル変数でrequire.jsのすべての依存関係を参照し、それをnode.jsテストに使用することで、機能しましたが、設計が非常に醜いため、要点を打ち負かしたと感じました。

私の現在のアプローチは次のとおりです。

  • JavaScriptモジュールをCommonJSモジュールとして記述します
  • Jasmine BDDノード統合を使用して、モジュールをサーバー側でテストします
  • ステッチを使用して、CommonJSモジュールをクライアント側で機能させる

これは私にとってはうまく機能していますが、次の点に注意してください。

  • ステッチはすべてのスクリプトを連結するため、クライアント側のデバッグは困難です。ステッチ構成からjQueryのようなライブラリを除外すると、これが役立つことがわかりました。
  • サーバー側をデバッグする方法がありません。node.jsデバッガーがありますが、ノードの最後のいくつかのバージョンでは機能していません。
于 2011-08-13T03:28:38.680 に答える
1

さて、数日ハッキングして、クライアント側のコード(とにかくその一部)をcommonjsモジュールとしてパッケージ化し、jasmine-nodeでテストしました。

興味のある方は、ジャスミンノードをフォークして、CIサーバーと統合するxmlファイルの出力を追加しました。これはかなりうまく機能しています。

ステッチを上げて実行した後、報告します。

これが私のフォークです:https ://github.com/boothead/jasmine-node

于 2011-08-17T14:20:56.807 に答える