Jasmine/PhantomJS 忽略 __defineGetter__ 方法

Jasmine/PhantomJS ignoring __defineGetter__ method

我正在使用 Jasmine 2.0 进行一些测试,我有一个像这样的代码的测试:

describe('My feature test', function () {
    describe('Negative asserts', function () {
        it('Expect location.search not to equal pre-defined value', function () {
            var myQueryValue = '?custom_query=true';

            expect(myQueryValue).not.toEqual(window.location.search);
        });
    });

    describe('Positive asserts', function () {
        beforeEach(function () {
            window.location.__defineGetter__('search', function () {
                return '?custom_query=true';
            });
        });

        it('Expect location.search to equal pre-defined value', function () {
            var myQueryValue = '?custom_query=true';
            console.log(window.location.search);
            expect(myQueryValue).toEqual(window.location.search);
        });
    });
});

我正在使用 g运行t 任务 运行 此代码使用 karma 并启动 Google Chrome (karma-chrome-launcher) 和 PhantomJS (karma-phantomjs-launcher) 浏览器。

在GoogleChrome测试中完美通过

LOG: '?custom_query=true'
Chrome 43.0.2357 (Mac OS X 10.10.3): Executed 99 of 99 SUCCESS (2.889 secs / 2.761 secs)

但是当在 PhantomJS 中测试 运行s 时 __defineGetter__ 方法被忽略:

LOG: ''
PhantomJS 1.9.8 (Mac OS X) My feature test Positive asserts Expect location.search to equal pre-defined value FAILED
PhantomJS 1.9.8 (Mac OS X): Executed 99 of 99 (1 FAILED) (2.528 secs / 2.522 secs)

知道为什么会这样吗?

编辑: 已经尝试 Object.defineProperty 但仍然无法正常工作。

defineProperty 方法在 PhantomJS 中失败并出现以下错误:

Attempting to change access mechanism for an unconfigurable property

我找不到明确记录的地方,但上面的错误让我怀疑这些属性是否在 PhantomJS 中不可修改。

遇到了同样的问题here,在这种情况下,建议的解决方案是使用可以在测试中覆盖的简单用户定义函数包装不可覆盖的方法:

// Wrap search property for testing purposes
function getLocationSearch() {
    return window.location.search;
}