* Adds toHaveSpyInteractions matcher
* Merges #1959 from @nitobuenida
* Fixes #1568
This commit is contained in:
Steve Gravrock
2022-03-18 11:04:37 -07:00
5 changed files with 288 additions and 0 deletions

View File

@@ -152,6 +152,7 @@ getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
'toHaveBeenCalledTimes',
'toHaveBeenCalledWith',
'toHaveClass',
'toHaveSpyInteractions',
'toMatch',
'toThrow',
'toThrowError',
@@ -6930,6 +6931,81 @@ getJasmineRequireObj().toHaveSize = function(j$) {
return toHaveSize;
};
getJasmineRequireObj().toHaveSpyInteractions = function(j$) {
var getErrorMsg = j$.formatErrorMsg(
'<toHaveSpyInteractions>',
'expect(<spyObj>).toHaveSpyInteractions()'
);
/**
* {@link expect} the actual (a {@link SpyObj}) spies to have been called.
* @function
* @name matchers#toHaveSpyInteractions
* @example
* expect(mySpyObj).toHaveSpyInteractions();
* expect(mySpyObj).not.toHaveSpyInteractions();
*/
function toHaveSpyInteractions(matchersUtil) {
return {
compare: function(actual) {
var result = {};
if (!j$.isObject_(actual)) {
throw new Error(
getErrorMsg('Expected a spy object, but got ' + typeof actual + '.')
);
}
if (arguments.length > 1) {
throw new Error(getErrorMsg('Does not take arguments'));
}
result.pass = false;
let hasSpy = false;
const calledSpies = [];
for (const spy of Object.values(actual)) {
if (!j$.isSpy(spy)) continue;
hasSpy = true;
if (spy.calls.any()) {
result.pass = true;
calledSpies.push([spy.and.identity, spy.calls.count()]);
}
}
if (!hasSpy) {
throw new Error(
getErrorMsg(
'Expected a spy object with spies, but object has no spies.'
)
);
}
let resultMessage;
if (result.pass) {
resultMessage =
'Expected spy object spies not to have been called, ' +
'but the following spies were called: ';
resultMessage += calledSpies
.map(([spyName, spyCount]) => {
return `${spyName} called ${spyCount} time(s)`;
})
.join(', ');
} else {
resultMessage =
'Expected spy object spies to have been called, ' +
'but no spies were called.';
}
result.message = resultMessage;
return result;
}
};
}
return toHaveSpyInteractions;
};
getJasmineRequireObj().toMatch = function(j$) {
var getErrorMsg = j$.formatErrorMsg(
'<toMatch>',