70 lines
2.1 KiB
JavaScript
70 lines
2.1 KiB
JavaScript
/*!
|
|
* Chai - overwriteChainableMethod utility
|
|
* Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
|
|
* MIT Licensed
|
|
*/
|
|
|
|
var chai = require('../../chai');
|
|
var transferFlags = require('./transferFlags');
|
|
|
|
/**
|
|
* ### .overwriteChainableMethod(ctx, name, method, chainingBehavior)
|
|
*
|
|
* Overwrites an already existing chainable method
|
|
* and provides access to the previous function or
|
|
* property. Must return functions to be used for
|
|
* name.
|
|
*
|
|
* utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf',
|
|
* function (_super) {
|
|
* }
|
|
* , function (_super) {
|
|
* }
|
|
* );
|
|
*
|
|
* Can also be accessed directly from `chai.Assertion`.
|
|
*
|
|
* chai.Assertion.overwriteChainableMethod('foo', fn, fn);
|
|
*
|
|
* Then can be used as any other assertion.
|
|
*
|
|
* expect(myFoo).to.have.lengthOf(3);
|
|
* expect(myFoo).to.have.lengthOf.above(3);
|
|
*
|
|
* @param {Object} ctx object whose method / property is to be overwritten
|
|
* @param {String} name of method / property to overwrite
|
|
* @param {Function} method function that returns a function to be used for name
|
|
* @param {Function} chainingBehavior function that returns a function to be used for property
|
|
* @namespace Utils
|
|
* @name overwriteChainableMethod
|
|
* @api public
|
|
*/
|
|
|
|
module.exports = function overwriteChainableMethod(ctx, name, method, chainingBehavior) {
|
|
var chainableBehavior = ctx.__methods[name];
|
|
|
|
var _chainingBehavior = chainableBehavior.chainingBehavior;
|
|
chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() {
|
|
var result = chainingBehavior(_chainingBehavior).call(this);
|
|
if (result !== undefined) {
|
|
return result;
|
|
}
|
|
|
|
var newAssertion = new chai.Assertion();
|
|
transferFlags(this, newAssertion);
|
|
return newAssertion;
|
|
};
|
|
|
|
var _method = chainableBehavior.method;
|
|
chainableBehavior.method = function overwritingChainableMethodWrapper() {
|
|
var result = method(_method).apply(this, arguments);
|
|
if (result !== undefined) {
|
|
return result;
|
|
}
|
|
|
|
var newAssertion = new chai.Assertion();
|
|
transferFlags(this, newAssertion);
|
|
return newAssertion;
|
|
};
|
|
};
|