如何使用更多 "expect" 功能扩展 frisby.js?
How to extend frisby.js with more "expect" functions?
有没有办法用自定义 expect
方法扩展 Frisby.js 模块?我不想修改源代码,这些扩展是特定于我的 REST API。我的目标是通过将它们组合成一个方法来避免重复常见测试。
问题是 Frisby.js 模块使用以下代码导出其方法:
exports.create = function(msg) {
return new Frisby(msg);
};
如何向 Frisby 添加新方法?这更像是一个 Javascript 继承问题,因为它适用于 Node.js 模块。
例如,测试 StackExchange API 的脚本会有很多重复的 .expect
子句,例如 .expectHeader()
和 .expectJSONTypes()
。我想将这些组合成一个 .expectSEwrapper()
方法。此方法是 StackExchange API 独有的,因此它不属于 Frisby.js。该脚本如下所示:
var frisby = require('frisby');
frisby.create('Whosebug Info')
.get('https://api.stackexchange.com/2.2/info?site=Whosebug', {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('Whosebug Badges')
.get('https://api.stackexchange.com/2.2/badges?order=desc&sort=rank&site=Whosebug', {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('Whosebug Info')
.get('https://api.stackexchange.com/2.2/info?site=Whosebug', {gzip: true})
.expectSEwrapper()
.toss();
frisby.create('Whosebug Badges')
.get('https://api.stackexchange.com/2.2/badges?order=desc&sort=rank&site=Whosebug', {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 原型中?
我想出了一个解决方案,它基本上是 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('Whosebug Info')
.get('https://api.stackexchange.com/2.2/info?site=Whosebug', {gzip: true})
.expectSEwrapper()
.toss();
有没有办法用自定义 expect
方法扩展 Frisby.js 模块?我不想修改源代码,这些扩展是特定于我的 REST API。我的目标是通过将它们组合成一个方法来避免重复常见测试。
问题是 Frisby.js 模块使用以下代码导出其方法:
exports.create = function(msg) {
return new Frisby(msg);
};
如何向 Frisby 添加新方法?这更像是一个 Javascript 继承问题,因为它适用于 Node.js 模块。
例如,测试 StackExchange API 的脚本会有很多重复的 .expect
子句,例如 .expectHeader()
和 .expectJSONTypes()
。我想将这些组合成一个 .expectSEwrapper()
方法。此方法是 StackExchange API 独有的,因此它不属于 Frisby.js。该脚本如下所示:
var frisby = require('frisby');
frisby.create('Whosebug Info')
.get('https://api.stackexchange.com/2.2/info?site=Whosebug', {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('Whosebug Badges')
.get('https://api.stackexchange.com/2.2/badges?order=desc&sort=rank&site=Whosebug', {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('Whosebug Info')
.get('https://api.stackexchange.com/2.2/info?site=Whosebug', {gzip: true})
.expectSEwrapper()
.toss();
frisby.create('Whosebug Badges')
.get('https://api.stackexchange.com/2.2/badges?order=desc&sort=rank&site=Whosebug', {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 原型中?
我想出了一个解决方案,它基本上是 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('Whosebug Info')
.get('https://api.stackexchange.com/2.2/info?site=Whosebug', {gzip: true})
.expectSEwrapper()
.toss();