Javascript jasmine测试中的模拟窗口属性

时间:2015-10-05 13:08:24

标签: javascript unit-testing jasmine

我有一个需要JSON的对象。该对象填充isSupported函数,并且我正在尝试为其编写测试。

(function() {
    'use strict';

    this.myFactory = function() {};

    this.myFactory.isSupported = function() {
        return !!this.JSON;
    };
}).call(window);

如果我只为特定测试设置window.JSON = false,那么所有其他测试显然都会因为需要而失败。

describe('Test IsSupported', function() {

    it('Should return false if no JSON', function() {
        window.JSON = undefined;
        expect(myFactory.isSupported()).toEqual(false);
    });

});

如何在模拟窗口的上下文中测试此函数?

1 个答案:

答案 0 :(得分:0)

我会在你工厂的构造函数中注入窗口,这样代码是可测试的,同时仍可在浏览器中使用:

<强> factory.js

module.exports = function(window){

    return {
        isSupported: function() {
            return !!window.JSON;
        }
    }

};

<强> factory.spec.js

var Factory = require('./factory');
fdescribe('Test IsSupported', function() {

    it('Should return false if no JSON', function() {
        var window = {JSON: false};
        var factory = Factory(window);

        expect(factory.isSupported()).toBeFalsy();
    });

    it('Should return true if yes JSON', function() {
        var window = {JSON: true};
        var factory = Factory(window);

        expect(factory.isSupported()).toBeTruthy();
    });

});