This approach makes it hard to scale and goes against DRY and debuggability vs the previous approach which followed Python parameterized testing, but this was the recommendation of the Jasmine team to keep it consistent with other tests. Further tests here could be adding other types like Array, Map, WeakMap, Set, WeakSet...
106 lines
3.1 KiB
JavaScript
Executable File
106 lines
3.1 KiB
JavaScript
Executable File
describe('toHaveSpyInteractions', function() {
|
|
it('detects spy interactions', function() {
|
|
let matcher = jasmineUnderTest.matchers.toHaveSpyInteractions();
|
|
let spyObj = jasmineUnderTest
|
|
.getEnv()
|
|
.createSpyObj('NewClass', ['spyA', 'spyB']);
|
|
|
|
spyObj.spyA();
|
|
|
|
let result = matcher.compare(spyObj);
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message).toContain(
|
|
'Expected spy object spies to have been called'
|
|
);
|
|
});
|
|
|
|
it('detects multiple spy interactions', function() {
|
|
let matcher = jasmineUnderTest.matchers.toHaveSpyInteractions();
|
|
let spyObj = jasmineUnderTest
|
|
.getEnv()
|
|
.createSpyObj('NewClass', ['spyA', 'spyB']);
|
|
|
|
spyObj.spyA();
|
|
spyObj.spyB();
|
|
spyObj.spyA();
|
|
|
|
let result = matcher.compare(spyObj);
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message).toContain(
|
|
'Expected spy object spies to have been called'
|
|
);
|
|
});
|
|
|
|
it('detects no spy interactions', function() {
|
|
let matcher = jasmineUnderTest.matchers.toHaveSpyInteractions();
|
|
let spyObj = jasmineUnderTest
|
|
.getEnv()
|
|
.createSpyObj('NewClass', ['spyA', 'spyB']);
|
|
|
|
let result = matcher.compare(spyObj);
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message).toContain(
|
|
'Expected spy object spies to have been called'
|
|
);
|
|
});
|
|
|
|
it('ignores non-observed spy object interactions', function() {
|
|
let matcher = jasmineUnderTest.matchers.toHaveSpyInteractions();
|
|
let spyObj = jasmineUnderTest
|
|
.getEnv()
|
|
.createSpyObj('NewClass', ['spyA', 'spyB']);
|
|
spyObj.otherMethod = function() {};
|
|
|
|
spyObj.otherMethod();
|
|
|
|
let result = matcher.compare(spyObj);
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message).toContain(
|
|
'Expected spy object spies to have been called'
|
|
);
|
|
});
|
|
|
|
it(`throws error if a non-object is passed`, function() {
|
|
let matcher = jasmineUnderTest.matchers.toHaveSpyInteractions();
|
|
|
|
expect(function() {
|
|
matcher.compare(true);
|
|
}).toThrowError(Error, /Expected a spy object, but got/);
|
|
|
|
expect(function () {
|
|
matcher.compare(123);
|
|
}).toThrowError(Error, /Expected a spy object, but got/);
|
|
|
|
expect(function () {
|
|
matcher.compare('string');
|
|
}).toThrowError(Error, /Expected a spy object, but got/);
|
|
});
|
|
|
|
it('throws error if arguments are passed', function() {
|
|
let matcher = jasmineUnderTest.matchers.toHaveSpyInteractions();
|
|
let spyObj = jasmineUnderTest
|
|
.getEnv()
|
|
.createSpyObj('NewClass', ['spyA', 'spyB']);
|
|
|
|
expect(function() {
|
|
matcher.compare(spyObj, 'an argument');
|
|
}).toThrowError(Error, /Does not take arguments/);
|
|
});
|
|
|
|
it('throws error if spy object has no spies', function() {
|
|
let matcher = jasmineUnderTest.matchers.toHaveSpyInteractions();
|
|
const spyObj = jasmineUnderTest
|
|
.getEnv()
|
|
.createSpyObj('NewClass', ['notSpy']);
|
|
// Removing spy since spy objects cannot be created without spies.
|
|
spyObj.notSpy = function() {};
|
|
|
|
expect(function() {
|
|
matcher.compare(spyObj);
|
|
}).toThrowError(
|
|
Error,
|
|
/Expected a spy object with spies, but object has no spies/
|
|
);
|
|
});
|
|
});
|