Как расширить 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();