如何扩展更多的“期望”functionfrisby.js?
有没有办法用自定义expect
方法来扩展Frisby.js模块? 我不想修改源代码,这些扩展特定于我的REST API。 我的目标是通过将它们组合成一种方法来避免重复常见的testing。
问题是Frisby.js模块用这个代码导出它的方法:
exports.create = function(msg) { return new Frisby(msg); };
我如何将新方法添加到Frisby? 这更像是一个Javascriptinheritance问题,因为它适用于Node.js模块。
例如,testing.expect
API的脚本会有很多重复的.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原型?
我想出了一个基本上是Frisby.js的包装的解决scheme。 在一个新的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 spec文件中,我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();