Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to unit test an Angular directive that uses $window

I've got a bunch of working unit tests for various Angular (1.4.7) directives, and I'm using Karma, Jasmine and Sinon for testing.

I'm trying to add a unit test for a new directive, which is the only directive I currently have that uses $window but I'm seeing a cryptic error in the console output:

TypeError: 'undefined' is not an object (evaluating 'this.proxy.toString')

This error is coming from sinon.js at line 2372.

I'm doing all the 'normal' things in a directive unit test such as creating a fake element that has the directive as an attribute:

testElement = document.createElement('div');
testElement.setAttribute('data-my-directive');
document.body.appendChild(testElement);

And compiling the directive:

$compile(testElement)($scope);

I'm using $provide to try mock the $window object:

module('app', function ($provide) {
    $provide.value('$window', { id: 'test' });
});

But as soon as I try to use $window in the file being tested, the error shown above is thrown.

As I say, I have a bunch of other unit tests for other directives, services and controllers working as expected, so everything appears to be setup correctly. It's just this particular test.

Any ideas?

like image 803
danwellman Avatar asked Feb 16 '16 09:02

danwellman


People also ask

How do you mock a directive?

A mock directive in Angular tests can be created by MockDirective function. The mock directive has the same interface as its original directive, but all its methods are dummies. In order to create a mock directive, pass the original directive into MockDirective function.

What is Angular TestBed?

TestBed is the primary api for writing unit tests for Angular applications and libraries.

What are directives in Angular?

Directives are classes that add additional behavior to elements in your Angular applications. Use Angular's built-in directives to manage forms, lists, styles, and what users see.


1 Answers

I am not sure if this is the same bug, but just a couple of days ago a fix to similar issue was got solved on sinon github:

https://github.com/sinonjs/sinon/pull/833

Fix contains lines:

var callStr = this.proxy ? this.proxy.toString() + "(" : "";

where the null check is one thing and several other lines.

This fix is at file lib/sinon/call.js in commit 7a18eb5.

I am not sure if this is same, because file is different and so is line, too. Still, this was so interesting that I would try latest sinon version and see if this gets fixed. It may be though, that similar error is in several parts of sinon, if the coder is for example same in both files.

like image 197
mico Avatar answered Sep 24 '22 17:09

mico