0

テストしようとしているコードは、RequireJs loader pluginsに依存しています。requirejs/textを使用した例:

require(['text!templates/foo'], function (data) {
  // handle loaded data
});

text!templates/foo特定の単体テストでは、応答をモックし、テストに関連するものでオーバーライドしようとしています:

it('should load a template', function (done) {

  // TODO: mock 'text!templates/foo' here to return 'mock_data'

  // templateViewer uses the text plugin internally to do the actual loading
  templateViewer.templateFor('foo', function (error, templateData) {
    expect(templateData).toEqual('mock_data');
    done();
  });

});

私は RequireJs の依存関係のモックソリューション、特にSquire.jsを見てきましたが、それらはすべてプラグインの応答ではなく、通常の依存関係のモックに適しているようです。

また、実際の呼び出しを置き換えるためにsinonなどのスタブ ライブラリも調べましたが、問題があるようです。require

おすすめの練習法は?text私のrequirejs構成でプラグイン全体をモックのものに置き換えるのではなく、特定のテストでその応答の一部をオーバーライドするだけです。

私のセットアップは node+mocha+requirejs です

編集

Squire に関する私の問題を確認するには、この例のフィドル プロジェクトを参照してください。

http://runnable.com/VUBoI0ex6v9Gs-BJ/squirejs-with-plugins-for-node-js-and-hello-world

4

1 に答える 1

2

これは、 require から得られるものをモックしますtext!foo/x.html。プラグインは特別なものではなく、プラグイン名を含むパス全体をモックするだけです。

var requirejs = require("requirejs");
var assert = require("assert");

requirejs.config({
    baseUrl: __dirname,
    packages: [
        {
            name: "squire",
            location: "node_modules/squirejs",
            main: "src/Squire"
        }
    ]
});

var x;
before(function (done) {
    requirejs(["squire"], function (Squire) {
        var injector = new Squire();

        injector.mock("text!foo/x.html", "foo").require(["text!foo/x.html"],
                                                   function (_x) {
            x = _x;
            done();
        });
    });
});

it("foo", function () {
    assert.equal(x, "foo");
});

質問に追加したサンプルコードで発生する問題は、ローダーから渡されたrequireを使用する代わりにグローバルを使用することです。依存関係としてrequire追加する必要があります。require

define(['require', ....], function (require, ....) {

このrequireモジュールは特別で、RequireJS によって予約されています。関数への参照を返しますrequirerequireたとえば、特定のコンテキストにロードされたモジュールがそのコンテキストにバインドされた関数を使用するように RequireJS のコンテキストを使用するときに、これを使用する必要があります。SquireJS も、 への呼び出しをトラップできるように、これを行う必要がありますrequire。グローバルrequireは SquireJS をバイパスします。

于 2015-04-28T11:00:37.827 に答える