notAChance
notAChance

Reputation: 1430

Karma - Expected undefined to equal

I've got my mock window object and method:

var window = {
    open: function (url, target, specs) {
        var spec, specKey;
        this.href = url;
        this.target = target;
        // Parse through the spec string to grab the parameters you passed through
        var specArray = specs.split(',');
        for (specKey in specArray) {
            spec = specArray[specKey].split('=');
            this[String.trim(spec[0])] = String.trim(spec[1]);
        }
    }
};

and my test case:

describe('$scope.popup1', function () {

    it('should open a popup window when ISIN hyperlink is clicked within grid, passing ISIN object s values to shareDataService', inject(function ($window) {
        spyOn($window, 'open').and.callFake(function () {
            return true;
        });
        scope.popup1()
        expect(window.open).toHaveBeenCalled();
        expect(window.open.href).toEqual("views/Box_Ladder.html");
    })
   )
})

But I get Expected undefined to equal 'views/Box_Ladder.html'. I'm not sure how window.open.href is undefined seeing as I declared it above?

EDIT - updated code, still same error:

describe('mainCtrl', function () {

beforeEach(module('app'));
var controller, scope;
var window = {
    open: function (url, target, specs) {
console.log("function being called")
        var spec, specKey;
        this.href = url;
        this.target = target;
        // Parse through the spec string to grab the parameters you passed through
        var specArray = specs.split(',');
        for (specKey in specArray) {
            spec = specArray[specKey].split('=');
            this[String.trim(spec[0])] = String.trim(spec[1]);
        }
    }
};

beforeEach(inject(function ($controller, $window, $rootScope) {
    scope = $rootScope.$new();
    controller = $controller('mainCtrl', {$scope: scope});
    window = $window;
}));

describe('$scope.popup1', function () {

    it('should open a popup window when ISIN hyperlink is clicked within grid, passing ISIN object s values to shareDataService', inject(function ($window) {
        spyOn($window, 'open').and.callThrough()
        scope.popup1()
        expect(window.open).toHaveBeenCalled();
        expect(window.href).toEqual("views/Box_Ladder.html");
        //expect(window.location.target).toEqual("_blank");
        //expect(window.location.height).toEqual(400);
        //expect(window.width).toEqual(700);
    })
   )
})
});

And popup1() function:

$scope.popup1 = function (isinData) {
    var popup1 = window.open("views/Box_Ladder.html", "_blank",
                        "height = 400, width = 700");
    shareDataService.setIsinClickValue(isinData);
}

Upvotes: 0

Views: 5320

Answers (1)

scareddragon
scareddragon

Reputation: 445

In open function this is referring to window object, not the function itself, so try this:

expect(window.href).toEqual("views/Box_Ladder.html");

More info about this here: How does the "this" keyword work?

Also, you have used callFake which according to the docs is:

Spies: andCallFake

By chaining the spy with andCallFake, all calls to the spy will delegate to the supplied function.

You can either register your implementation as fake function or use callThrough which is calling real implementation (or the one that you have mocked before).

You can find all details in Jasmine docs: http://jasmine.github.io/

Upvotes: 1

Related Questions