Testing for instanceof using Jasmine
Solution 1
Jasmine uses matchers to do its assertions, so you can write your own custom matcher to check anything you want, including an instanceof check. https://github.com/pivotal/jasmine/wiki/Matchers
In particular, check out the Writing New Matchers section.
Solution 2
Jasmine >=3.5.0
Jasmine provides the toBeInstanceOf
matcher.
it("matches any value", () => {
expect(3).toBeInstanceOf(Number);
});
Jasmine >2.3.0
To check if something is an instanceof [Object]
Jasmine provides jasmine.any
:
it("matches any value", function() {
expect({}).toEqual(jasmine.any(Object));
expect(12).toEqual(jasmine.any(Number));
});
Solution 3
I do prefer the more readable/intuitive (in my opinion) use with the instanceof operator.
class Parent {}
class Child extends Parent {}
let c = new Child();
expect(c instanceof Child).toBeTruthy();
expect(c instanceof Parent).toBeTruthy();
For the sake of completeness you can also use the prototype constructor
property in some cases.
expect(my_var_1.constructor).toBe(Array);
expect(my_var_2.constructor).toBe(Object);
expect(my_var_3.constructor).toBe(Error);
// ...
BEWARE that this won't work if you need to check whether an object inherited from another or not.
class Parent {}
class Child extends Parent {}
let c = new Child();
console.log(c.constructor === Child); // prints "true"
console.log(c.constructor === Parent); // prints "false"
If you need inheritance support definitely use the instanceof
operator or the jasmine.any() function like Roger suggested.
Object.prototype.constructor reference.
Mike Rifgin
Updated on October 28, 2020Comments
-
Mike Rifgin over 3 years
I'm new to Jasmine and testing in general. One block of my code checks whether my library has been instantiated using the new operator:
//if 'this' isn't an instance of mylib... if (!(this instanceof mylib)) { //return a new instance return new mylib(); }
How can I test this using Jasmine?