describe('AsyncExpectation', function() { beforeEach(function() { jasmineUnderTest.Expectation.addAsyncCoreMatchers( jasmineUnderTest.asyncMatchers ); }); describe('Factory', function() { it('throws an Error if promises are not available', function() { var thenable = { then: function() {} }, options = { global: {}, actual: thenable }; function f() { jasmineUnderTest.Expectation.asyncFactory(options); } expect(f).toThrowError( 'expectAsync is unavailable because the environment does not support promises.' ); }); it('throws an Error if the argument is not a promise', function() { jasmine.getEnv().requirePromises(); function f() { jasmineUnderTest.Expectation.asyncFactory({ actual: 'not a promise' }); } expect(f).toThrowError( 'Expected expectAsync to be called with a promise.' ); }); }); describe('#not', function() { it('converts a pass to a fail', function() { jasmine.getEnv().requirePromises(); var addExpectationResult = jasmine.createSpy('addExpectationResult'), actual = Promise.resolve(), expectation = jasmineUnderTest.Expectation.asyncFactory({ util: jasmineUnderTest.matchersUtil, actual: actual, addExpectationResult: addExpectationResult }); return expectation.not.toBeResolved().then(function() { expect(addExpectationResult).toHaveBeenCalledWith( false, jasmine.objectContaining({ passed: false, message: 'Expected a promise not to be resolved.' }) ); }); }); it('converts a fail to a pass', function() { jasmine.getEnv().requirePromises(); var addExpectationResult = jasmine.createSpy('addExpectationResult'), actual = Promise.reject(), expectation = jasmineUnderTest.Expectation.asyncFactory({ util: jasmineUnderTest.matchersUtil, actual: actual, addExpectationResult: addExpectationResult }); return expectation.not.toBeResolved().then(function() { expect(addExpectationResult).toHaveBeenCalledWith( true, jasmine.objectContaining({ passed: true, message: '' }) ); }); }); }); it('propagates rejections from the comparison function', function() { jasmine.getEnv().requirePromises(); var error = new Error('ExpectationSpec failure'); var addExpectationResult = jasmine.createSpy('addExpectationResult'), actual = dummyPromise(), expectation = jasmineUnderTest.Expectation.asyncFactory({ actual: actual, addExpectationResult: addExpectationResult }); spyOn(expectation, 'toBeResolved').and.returnValue(Promise.reject(error)); return expectation.toBeResolved().then( function() { fail('Expected a rejection'); }, function(e) { expect(e).toBe(error); } ); }); describe('#withContext', function() { it('prepends the context to the generated failure message', function() { jasmine.getEnv().requirePromises(); var util = { buildFailureMessage: function() { return 'failure message'; } }, addExpectationResult = jasmine.createSpy('addExpectationResult'), expectation = jasmineUnderTest.Expectation.asyncFactory({ actual: Promise.reject('rejected'), addExpectationResult: addExpectationResult, util: util }); return expectation .withContext('Some context') .toBeResolved() .then(function() { expect(addExpectationResult).toHaveBeenCalledWith( false, jasmine.objectContaining({ message: 'Some context: failure message' }) ); }); }); it('prepends the context to a custom failure message', function() { jasmine.getEnv().requirePromises(); var util = { buildFailureMessage: function() { return 'failure message'; } }, addExpectationResult = jasmine.createSpy('addExpectationResult'), expectation = jasmineUnderTest.Expectation.asyncFactory({ actual: Promise.reject('b'), addExpectationResult: addExpectationResult, util: util }); return expectation .withContext('Some context') .toBeResolvedTo('a') .then(function() { expect(addExpectationResult).toHaveBeenCalledWith( false, jasmine.objectContaining({ message: "Some context: Expected a promise to be resolved to 'a' but it was rejected." }) ); }); }); it('prepends the context to a custom failure message from a function', function() { pending('should actually work, but no custom matchers for async yet'); jasmine.getEnv().requirePromises(); var util = { buildFailureMessage: function() { return 'failure message'; } }, addExpectationResult = jasmine.createSpy('addExpectationResult'), actual = Promise.reject(), expectation = jasmineUnderTest.Expectation.asyncFactory({ actual: actual, addExpectationResult: addExpectationResult, util: util }); return expectation .withContext('Some context') .toBeResolved() .then(function() { expect(addExpectationResult).toHaveBeenCalledWith( false, jasmine.objectContaining({ message: 'Some context: msg' }) ); }); }); it('works with #not', function() { jasmine.getEnv().requirePromises(); var addExpectationResult = jasmine.createSpy('addExpectationResult'), actual = Promise.resolve(), expectation = jasmineUnderTest.Expectation.asyncFactory({ actual: actual, addExpectationResult: addExpectationResult, util: jasmineUnderTest.matchersUtil }); return expectation .withContext('Some context') .not.toBeResolved() .then(function() { expect(addExpectationResult).toHaveBeenCalledWith( false, jasmine.objectContaining({ message: 'Some context: Expected a promise not to be resolved.' }) ); }); }); it('works with #not and a custom message', function() { jasmine.getEnv().requirePromises(); var addExpectationResult = jasmine.createSpy('addExpectationResult'), actual = Promise.resolve('a'), expectation = jasmineUnderTest.Expectation.asyncFactory({ actual: actual, addExpectationResult: addExpectationResult, util: jasmineUnderTest.matchersUtil }); return expectation .withContext('Some context') .not.toBeResolvedTo('a') .then(function() { expect(addExpectationResult).toHaveBeenCalledWith( false, jasmine.objectContaining({ message: "Some context: Expected a promise not to be resolved to 'a'." }) ); }); }); }); function dummyPromise() { return new Promise(function(resolve, reject) {}); } });