Testing for instanceof using Jasmine

JavascriptUnit TestingTestingJasmine

Javascript Problem Overview


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?

Javascript Solutions


Solution 1 - Javascript

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 2 - Javascript

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.

Solution 3 - Javascript

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMike RifginView Question on Stackoverflow
Solution 1 - JavascriptsluijsView Answer on Stackoverflow
Solution 2 - JavascriptFrancesco CasulaView Answer on Stackoverflow
Solution 3 - JavascriptJeff StoreyView Answer on Stackoverflow