By deferring the evaluation of these messages, we can avoid the
expensive creation of them when in the majority use case (tests are
passing) they are not needed.
These failure messages were causing performance problems with larger
objects needed to be pretty printed as discussed in #520 and brought up
by @rdy.
[fixes #65925900][fixes #520]
281 lines
9.0 KiB
JavaScript
281 lines
9.0 KiB
JavaScript
describe("toThrowError", function() {
|
|
it("throws an error when the actual is not a function", function() {
|
|
var matcher = j$.matchers.toThrowError();
|
|
|
|
expect(function() {
|
|
matcher.compare({});
|
|
}).toThrowError("Actual is not a Function");
|
|
});
|
|
|
|
it("throws an error when the expected is not an Error, string, or RegExp", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw new Error("foo");
|
|
};
|
|
|
|
expect(function() {
|
|
matcher.compare(fn, 1);
|
|
}).toThrowError("Expected is not an Error, string, or RegExp.");
|
|
});
|
|
|
|
it("throws an error when the expected error type is not an Error", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw new Error("foo");
|
|
};
|
|
|
|
expect(function() {
|
|
matcher.compare(fn, void 0, "foo");
|
|
}).toThrowError("Expected error type is not an Error.");
|
|
});
|
|
|
|
it("throws an error when the expected error message is not a string or RegExp", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw new Error("foo");
|
|
};
|
|
|
|
expect(function() {
|
|
matcher.compare(fn, Error, 1);
|
|
}).toThrowError("Expected error message is not a string or RegExp.");
|
|
});
|
|
|
|
it("fails if actual does not throw at all", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
return true;
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn);
|
|
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message).toEqual("Expected function to throw an Error.");
|
|
});
|
|
|
|
it("fails if thrown is not an instanceof Error", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw 4;
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn);
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message()).toEqual("Expected function to throw an Error, but it threw 4.");
|
|
});
|
|
|
|
it("fails with the correct message if thrown is a falsy value", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw undefined;
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn);
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message()).toEqual("Expected function to throw an Error, but it threw undefined.");
|
|
});
|
|
|
|
it("passes if thrown is a type of Error, but there is no expected error", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw new TypeError();
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn);
|
|
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message).toEqual("Expected function not to throw an Error, but it threw TypeError.");
|
|
});
|
|
|
|
it("passes if thrown is an Error and the expected is the same message", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw new Error("foo");
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, "foo");
|
|
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message()).toEqual("Expected function not to throw an exception with message 'foo'.");
|
|
});
|
|
|
|
it("fails if thrown is an Error and the expected is not the same message", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw new Error("foo");
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, "bar");
|
|
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message()).toEqual("Expected function to throw an exception with message 'bar', but it threw an exception with message 'foo'.");
|
|
});
|
|
|
|
it("passes if thrown is an Error and the expected is a RegExp that matches the message", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw new Error("a long message");
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, /long/);
|
|
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message()).toEqual("Expected function not to throw an exception with a message matching /long/.");
|
|
});
|
|
|
|
it("fails if thrown is an Error and the expected is a RegExp that does not match the message", function() {
|
|
var matcher = j$.matchers.toThrowError(),
|
|
fn = function() {
|
|
throw new Error("a long message");
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, /foo/);
|
|
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message()).toEqual("Expected function to throw an exception with a message matching /foo/, but it threw an exception with message 'a long message'.");
|
|
});
|
|
|
|
it("passes if thrown is an Error and the expected the same Error", function() {
|
|
var util = {
|
|
equals: jasmine.createSpy('delegated-equal').and.returnValue(true)
|
|
},
|
|
matcher = j$.matchers.toThrowError(util),
|
|
fn = function() {
|
|
throw new Error();
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, Error);
|
|
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message).toEqual("Expected function not to throw Error.");
|
|
});
|
|
|
|
it("passes if thrown is a custom error that takes arguments and the expected is the same error", function() {
|
|
var util = {
|
|
equals: jasmine.createSpy('delegated-equal').and.returnValue(true)
|
|
},
|
|
matcher = j$.matchers.toThrowError(util),
|
|
CustomError = function CustomError(arg) { arg.x },
|
|
fn = function() {
|
|
throw new CustomError({ x: 1 });
|
|
},
|
|
result;
|
|
|
|
CustomError.prototype = new Error();
|
|
CustomError.prototype.constructor = CustomError;
|
|
|
|
result = matcher.compare(fn, CustomError);
|
|
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message).toEqual("Expected function not to throw CustomError.");
|
|
});
|
|
|
|
it("fails if thrown is an Error and the expected is a different Error", function() {
|
|
var util = {
|
|
equals: jasmine.createSpy('delegated-equal').and.returnValue(false)
|
|
},
|
|
matcher = j$.matchers.toThrowError(util),
|
|
fn = function() {
|
|
throw new Error();
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, TypeError);
|
|
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message).toEqual("Expected function to throw TypeError, but it threw Error.");
|
|
});
|
|
|
|
it("passes if thrown is a type of Error and it is equal to the expected Error and message", function() {
|
|
var util = {
|
|
equals: jasmine.createSpy('delegated-equal').and.returnValue(true)
|
|
},
|
|
matcher = j$.matchers.toThrowError(util),
|
|
fn = function() {
|
|
throw new TypeError("foo");
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, TypeError, "foo");
|
|
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message()).toEqual("Expected function not to throw TypeError with message 'foo'.");
|
|
});
|
|
|
|
it("passes if thrown is a custom error that takes arguments and it is equal to the expected custom error and message", function() {
|
|
var util = {
|
|
equals: jasmine.createSpy('delegated-equal').and.returnValue(true)
|
|
},
|
|
matcher = j$.matchers.toThrowError(util),
|
|
CustomError = function CustomError(arg) { this.message = arg.message },
|
|
fn = function() {
|
|
throw new CustomError({message: "foo"});
|
|
},
|
|
result;
|
|
|
|
CustomError.prototype = new Error();
|
|
CustomError.prototype.constructor = CustomError;
|
|
|
|
result = matcher.compare(fn, CustomError, "foo");
|
|
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message()).toEqual("Expected function not to throw CustomError with message 'foo'.");
|
|
});
|
|
|
|
it("fails if thrown is a type of Error and the expected is a different Error", function() {
|
|
var util = {
|
|
equals: jasmine.createSpy('delegated-equal').and.returnValue(false)
|
|
},
|
|
matcher = j$.matchers.toThrowError(util),
|
|
fn = function() {
|
|
throw new TypeError("foo");
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, TypeError, "bar");
|
|
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message()).toEqual("Expected function to throw TypeError with message 'bar', but it threw TypeError with message 'foo'.");
|
|
});
|
|
|
|
it("passes if thrown is a type of Error and has the same type as the expected Error and the message matches the expected message", function() {
|
|
var util = {
|
|
equals: jasmine.createSpy('delegated-equal').and.returnValue(true)
|
|
},
|
|
matcher = j$.matchers.toThrowError(util),
|
|
fn = function() {
|
|
throw new TypeError("foo");
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, TypeError, /foo/);
|
|
|
|
expect(result.pass).toBe(true);
|
|
expect(result.message()).toEqual("Expected function not to throw TypeError with message matching /foo/.");
|
|
});
|
|
|
|
it("fails if thrown is a type of Error and the expected is a different Error", function() {
|
|
var util = {
|
|
equals: jasmine.createSpy('delegated-equal').and.returnValue(false)
|
|
},
|
|
matcher = j$.matchers.toThrowError(util),
|
|
fn = function() {
|
|
throw new TypeError("foo");
|
|
},
|
|
result;
|
|
|
|
result = matcher.compare(fn, TypeError, /bar/);
|
|
|
|
expect(result.pass).toBe(false);
|
|
expect(result.message()).toEqual("Expected function to throw TypeError with message matching /bar/, but it threw TypeError with message 'foo'.");
|
|
});
|
|
});
|