Skip to content

Commit

Permalink
feat(core): add support for using async/await with Jasmine (#24637)
Browse files Browse the repository at this point in the history
Example:
```
it('...', await(async() => {
  doSomething();
  await asyncFn();
  doSomethingAfter();
}));
```

PR Close #24637
  • Loading branch information
mhevery committed Jun 28, 2018
1 parent 676ec41 commit 71100e6
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 0 deletions.
31 changes: 31 additions & 0 deletions packages/core/test/testability/jasmine_await_spec.ts
@@ -0,0 +1,31 @@
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/

import {jasmineAwait} from '../../testing';


describe('await', () => {
let pass: boolean;
beforeEach(() => pass = false);
afterEach(() => expect(pass).toBe(true));

it('should convert passes', jasmineAwait(async() => { pass = await Promise.resolve(true); }));

it('should convert failures', (done) => {
const error = new Error();
const fakeDone: DoneFn = function() { fail('passed, but should have failed'); } as any;
fakeDone.fail = function(value: any) {
expect(value).toBe(error);
done();
};
jasmineAwait(async() => {
pass = await Promise.resolve(true);
throw error;
})(fakeDone);
});
});
34 changes: 34 additions & 0 deletions packages/core/testing/src/jasmine_await.ts
@@ -0,0 +1,34 @@
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/

/**
* Converts an `async` function, with `await`, into a function which is compatible with Jasmine test
* framework.
*
* For asynchronous function blocks, Jasmine expects `it` (and friends) to take a function which
* takes a `done` callback. (Jasmine does not understand functions which return `Promise`.) The
* `jasmineAwait()` wrapper converts the test function returning `Promise` into a function which
* Jasmine understands.
*
*
* Example:
* ```
* it('...', jasmineAwait(async() => {
* doSomething();
* await asyncFn();
* doSomethingAfter();
* }));
* ```
*
*/
export function jasmineAwait(fn: () => Promise<any>):
(done: {(): void; fail: (message?: Error | string) => void;}) => void {
return function(done: {(): void; fail: (message?: Error | string) => void;}) {
fn().then(done, done.fail);
};
}
1 change: 1 addition & 0 deletions packages/core/testing/src/testing.ts
Expand Up @@ -13,6 +13,7 @@
*/

export * from './async';
export * from './jasmine_await';
export * from './component_fixture';
export * from './fake_async';
export * from './test_bed';
Expand Down
5 changes: 5 additions & 0 deletions tools/public_api_guard/core/testing.d.ts
Expand Up @@ -53,6 +53,11 @@ export declare class InjectSetupWrapper {
inject(tokens: any[], fn: Function): () => any;
}

export declare function jasmineAwait(fn: () => Promise<any>): (done: {
(): void;
fail: (message?: Error | string) => void;
}) => void;

/** @experimental */
export declare type MetadataOverride<T> = {
add?: Partial<T>;
Expand Down

0 comments on commit 71100e6

Please sign in to comment.