1

Frisby.js モジュールをカスタムexpectメソッドで拡張する方法はありますか? ソース コードを変更したくありません。これらの拡張機能は REST API に固有のものです。私の目標は、共通のテストを 1 つのメソッドにまとめることで、繰り返さないようにすることです。

問題は、Frisby.js モジュールが次のコードでメソッドをエクスポートしていることです。

exports.create = function(msg) {
  return new Frisby(msg);
};

Frisby に新しいメソッドを追加するにはどうすればよいですか? これは、Node.js モジュールに適用されるため、Javascript の継承に関する質問です。

たとえば、StackExchange APIをテストするスクリプトには、 andなどの多くの重複.expect句が.expectHeader()あり.expectJSONTypes()ます。.expectSEwrapper()これらをメソッドにまとめたいと思います。このメソッドは StackExchange API に固有のものであるため、Frisby.js には属しません。スクリプトは次のようになります。

var frisby = require('frisby');

frisby.create('StackOverflow Info')
  .get('https://api.stackexchange.com/2.2/info?site=stackoverflow', {gzip: true})
  .expectStatus(200)
  .expectHeader('content-type', 'application/json; charset=utf-8')
  .expectHeader('content-encoding', 'gzip')
  .expectJSONTypes('', {
    items: Array,
    has_more: Boolean,
    quota_max: Number,
    quota_remaining: Number
  })
  .toss();

frisby.create('StackOverflow Badges')
  .get('https://api.stackexchange.com/2.2/badges?order=desc&sort=rank&site=stackoverflow', {gzip: true})
  .expectStatus(200)
  .expectHeader('content-type', 'application/json; charset=utf-8')
  .expectHeader('content-encoding', 'gzip')
  .expectJSONTypes('', {
    items: Array,
    has_more: Boolean,
    quota_max: Number,
    quota_remaining: Number
  })
  .expectJSONTypes('items.0', {
     badge_type: String,
     award_count: Number,
     rank: String,
     badge_id: Number,
     link: String,
     name: String
  })
  .toss();

スクリプトを次のようにしたいと思います。

frisby.create('StackOverflow Info')
  .get('https://api.stackexchange.com/2.2/info?site=stackoverflow', {gzip: true})
  .expectSEwrapper()
  .toss();

frisby.create('StackOverflow Badges')
  .get('https://api.stackexchange.com/2.2/badges?order=desc&sort=rank&site=stackoverflow', {gzip: true})
  .expectSEwrapper()
  .expectJSONTypes('items.0', {
     badge_type: String,
     award_count: Number,
     rank: String,
     badge_id: Number,
     link: String,
     name: String
  })
  .toss();

これは、次のような新しいメソッドを追加することを意味します。

frisby.expectSEwrapper = function() {
    return this.expectStatus(200)
               .expectHeader('content-type', 'application/json; charset=utf-8')
               .expectHeader('content-encoding', 'gzip')
               .expectJSONTypes('', {
                 items: Array,
                 has_more: Boolean,
                 quota_max: Number,
                 quota_remaining: Number
               });

しかし、スクリプト内から Frisby プロトタイプに追加するにはどうすればよいでしょうか?

4

1 に答える 1

4

基本的に Frisby.js のラッパーである 1 つのソリューションを思いつきました。新しい Node モジュール (これを と呼びます) では、関数config.jsを拡張します。create()

var frisby = require('frisby');

// Customize Frisby.js for the StackExchange REST API
exports.frisby = {
    create: function(describe) {
        var _frisby = frisby.create(describe);

        _frisby.expectSEwrapper = function() {
            return this.expectStatus(200)
                       .expectHeader('content-type', 'application/json; charset=utf-8')
                       .expectHeader('content-encoding', 'gzip')
                       .expectJSONTypes('', {
                           items: Array,
                           has_more: Boolean,
                           quota_max: Number,
                           quota_remaining: Number
                       });
        }
        return _frisby;
    }
}

次に、Frisby.js 仕様ファイルで、次のrequireモジュールを作成します。

var config = require('./config.js');
var frisby = config.frisby;

この後、私は書くことができます:

frisby.create('StackOverflow Info')
  .get('https://api.stackexchange.com/2.2/info?site=stackoverflow', {gzip: true})
  .expectSEwrapper()
  .toss();
于 2015-11-30T18:52:28.423 に答える