0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-02-01 20:25:12 -05:00

fix(std/testing): assertThrows gracefully fails if non-Error thrown (#6330)

This commit is contained in:
Rob Waller 2020-06-23 15:47:09 +01:00 committed by GitHub
parent d2403caa3b
commit d615f0ff82
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 96 additions and 1 deletions

View file

@ -322,7 +322,8 @@ export function fail(msg?: string): void {
assert(false, `Failed assertion${msg ? `: ${msg}` : "."}`);
}
/** Executes a function, expecting it to throw. If it does not, then it
/**
* Executes a function, expecting it to throw. If it does not, then it
* throws. An error class and a string that should be included in the
* error message can also be asserted.
*/
@ -337,6 +338,9 @@ export function assertThrows<T = void>(
try {
fn();
} catch (e) {
if (e instanceof Error === false) {
throw new AssertionError("A non-Error object was thrown.");
}
if (ErrorClass && !(Object.getPrototypeOf(e) === ErrorClass.prototype)) {
msg = `Expected error to be instance of "${ErrorClass.name}", but was "${
e.constructor.name
@ -362,6 +366,11 @@ export function assertThrows<T = void>(
return error;
}
/**
* Executes a function which returns a promise, expecting it to throw or reject.
* If it does not, then it throws. An error class and a string that should be
* included in the error message can also be asserted.
*/
export async function assertThrowsAsync<T = void>(
fn: () => Promise<T>,
ErrorClass?: Constructor,
@ -373,6 +382,9 @@ export async function assertThrowsAsync<T = void>(
try {
await fn();
} catch (e) {
if (e instanceof Error === false) {
throw new AssertionError("A non-Error object was thrown or rejected.");
}
if (ErrorClass && !(Object.getPrototypeOf(e) === ErrorClass.prototype)) {
msg = `Expected error to be instance of "${ErrorClass.name}", but got "${
e.name

View file

@ -409,3 +409,86 @@ Deno.test({
);
},
});
Deno.test("Assert Throws Non-Error Fail", () => {
assertThrows(
() => {
assertThrows(
() => {
throw "Panic!";
},
String,
"Panic!"
);
},
AssertionError,
"A non-Error object was thrown."
);
assertThrows(
() => {
assertThrows(() => {
throw null;
});
},
AssertionError,
"A non-Error object was thrown."
);
assertThrows(
() => {
assertThrows(() => {
throw undefined;
});
},
AssertionError,
"A non-Error object was thrown."
);
});
Deno.test("Assert Throws Async Non-Error Fail", () => {
assertThrowsAsync(
() => {
return assertThrowsAsync(
() => {
return Promise.reject("Panic!");
},
String,
"Panic!"
);
},
AssertionError,
"A non-Error object was thrown or rejected."
);
assertThrowsAsync(
() => {
return assertThrowsAsync(() => {
return Promise.reject(null);
});
},
AssertionError,
"A non-Error object was thrown or rejected."
);
assertThrowsAsync(
() => {
return assertThrowsAsync(() => {
return Promise.reject(undefined);
});
},
AssertionError,
"A non-Error object was thrown or rejected."
);
assertThrowsAsync(
() => {
return assertThrowsAsync(() => {
throw undefined;
return Promise.resolve("Ok!");
});
},
AssertionError,
"A non-Error object was thrown or rejected."
);
});