Как расширить frisby.js более ожидаемыми функциями?

Есть ли способ расширить модуль Frisby.js с помощью пользовательских expect методы? Я не хочу изменять исходный код, эти расширения относятся к моему REST API. Моя цель - избежать повторения общих тестов, объединив их в метод.

Проблема в том, что модуль Frisby.js экспортирует свои методы с этим кодом:

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

Как бы я добавил новые методы в Фрисби? Это скорее вопрос наследования Javascript, так как он применяется к модулям Node.js.

Например, скрипт для тестирования API StackExchange будет иметь много дубликатов .expect пункты, как .expectHeader() а также .expectJSONTypes(), Я хотел бы объединить их в .expectSEwrapper() метод. Этот метод уникален для API StackExchange, поэтому он не будет принадлежать Frisby.js. Сценарий будет выглядеть так:

var frisby = require('frisby');

frisby.create('Stackru Info')
  .get('https://api.stackexchange.com/2.2/info?site=stackru', {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('Stackru Badges')
  .get('https://api.stackexchange.com/2.2/badges?order=desc&sort=rank&site=stackru', {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('Stackru Info')
  .get('https://api.stackexchange.com/2.2/info?site=stackru', {gzip: true})
  .expectSEwrapper()
  .toss();

frisby.create('Stackru Badges')
  .get('https://api.stackexchange.com/2.2/badges?order=desc&sort=rank&site=stackru', {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 из моего скрипта?

1 ответ

Решение

Я придумал одно решение, которое в основном является оболочкой для Frisby.js. В новом модуле 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('Stackru Info')
  .get('https://api.stackexchange.com/2.2/info?site=stackru', {gzip: true})
  .expectSEwrapper()
  .toss();
Другие вопросы по тегам