diff --git a/spec/core/integration/MatchersSpec.js b/spec/core/integration/MatchersSpec.js old mode 100644 new mode 100755 index 9e3f7f6c..30a9e656 --- a/spec/core/integration/MatchersSpec.js +++ b/spec/core/integration/MatchersSpec.js @@ -625,6 +625,28 @@ describe('Matchers (Integration)', function() { }); }); + describe('toHaveSpyInteractions', function() { + let spyObj; + beforeEach(function() { + spyObj = env.createSpyObj('NewClass', ['spyA', 'spyB']); + spyObj.otherMethod = function() {}; + }); + + verifyPasses(function(env) { + spyObj.spyA(); + env.expect(spyObj).toHaveSpyInteractions(); + }); + + verifyFails(function(env) { + env.expect(spyObj).toHaveSpyInteractions(); + }); + + verifyFails(function(env) { + spyObj.otherMethod(); + env.expect(spyObj).toHaveSpyInteractions(); + }); + }); + describe('toMatch', function() { verifyPasses(function(env) { env.expect('foo').toMatch(/oo$/); diff --git a/spec/core/matchers/toHaveSpyInteractions.js b/spec/core/matchers/toHaveSpyInteractions.js new file mode 100755 index 00000000..98f8c270 --- /dev/null +++ b/spec/core/matchers/toHaveSpyInteractions.js @@ -0,0 +1,57 @@ +describe('toHaveSpyInteractions', () => { + let spyObj; + beforeEach(() => { + spyObj = jasmineUnderTest.createSpyObj('NewClass', ['spyA', 'spyB']); + spyObj.otherMethod = function() {}; + }); + + it('detects spy interactions', () => { + spyObj.spyA(); + expect(spyObj).toHaveSpyInteractions(); + }); + + it('detects multiple spy interactions', () => { + spyObj.spyA(); + spyObj.spyB(); + spyObj.spyA(); + expect(spyObj).toHaveSpyInteractions(); + }); + + it('detects no spy interactions', () => { + expect(spyObj).not.toHaveSpyInteractions(); + }); + + it('ignores non-observed spy object interactions', () => { + spyObj.otherMethod(); + expect(spyObj).not.toHaveSpyInteractions(); + }); + + [true, 123, 'string'].forEach(testValue => { + it(`throws error if a non-object (${testValue}) is passed`, () => { + expect(() => { + expect(true).toHaveSpyInteractions(); + }).toThrowError(Error, /Expected a spy object, but got/); + }); + }); + + [['argument'], [false, 0]].forEach(testValue => { + it(`throws error if arguments (${testValue}) are passed`, () => { + expect(() => { + expect(spyObj).toHaveSpyInteractions(...testValue); + }).toThrowError(Error, /Does not take arguments/); + }); + }); + + it('throws error if spy object has no spies', () => { + const newSpyObj = jasmine.createSpyObj('OtherClass', ['method']); + // Removing spy since spy objects cannot be created without spies. + newSpyObj.method = function() {}; + + expect(() => { + expect(newSpyObj).toHaveSpyInteractions(); + }).toThrowError( + Error, + /Expected a spy object with spies, but object has no spies/ + ); + }); +});