如何扩展更多的“期望”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();