我正在使用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);
});
});
});
我使用grunt任务使用karma运行此代码并启动Google Chrome(karma-chrome-launcher
)和PhantomJS(karma-phantomjs-launcher
)浏览器。
在Google Chrome中,测试完全通过
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中运行时,__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
但仍无效。
答案 0 :(得分:1)
defineProperty
方法在PhantomJS中失败,出现以下错误:
尝试更改不可配置属性的访问机制
我找不到一个清楚记录的地方,但上面的错误让我想知道这些属性是否在PhantomJS中无法修改。
遇到同样的问题here,在这种情况下建议的解决方案是使用可在测试中覆盖的简单用户定义函数来包装不可覆盖的方法:
// Wrap search property for testing purposes
function getLocationSearch() {
return window.location.search;
}