我有一个在IE8中失败的脚本,因为Date.now()未定义。我已将Date.now()抽象为一个方法,并希望对它进行单元测试。我知道它在Date.now()未定义时有效。
Foo.prototype = {
date: function() {
// I think this works. Not sure until I get my unit test working...
if (typeof Date.now === 'undefined') {
Date.now = function () { return +new Date(); }
}
return Date.now(); // fails in IE8. Undefined.
}
}
我的测试就是这样的
describe('Foo', function() {
it('has the current date time', function() {
// This passes
spyOn(Date, 'now').and.returnValue(1234);
foo = new Foo;
expect(foo.date()).toBe(1234);
});
it('has the current date time for IE8', function() {
// This won't pass
spyOn(Date, 'now').and.returnValue(null);
foo = new Foo;
expect(foo.date()).toBe(1234); // TODO
});
});
如何删除undefined?我在想在returnValue中返回一个未定义的方法。
我知道我的测试没有完善,因为我刚刚开始使用Jasmine。
答案 0 :(得分:0)
你不能监视一个未定义的函数。 你可以这样做:
it('has the current date time for IE8', function() {
// This won't pass
var x = Date.now;
Date.now = undefined;
foo = new Foo;
expect(foo.date()).toBe(1234); // TODO
Date.now = x;
});
答案 1 :(得分:0)
问题是,间谍仍然表现得像一个函数,但是当你测试它是否存在时,你实际上并没有调用该方法。当您spyOn(Date, 'now')
使用间谍对象替换内置Date.now
函数时。如果你做了这样的事情:
describe('Foo', function() {
describe("without a Date.now", function() {
beforeEach(function() {
this.now = Date.now;
Date.now = undefined;
});
afterEach(function() {
Date.now = this.now;
});
it('has the current date time for IE8', function() {
spyOn(window, 'Date').and.returnValue(1234);
foo = new Foo;
expect(foo.date()).toBe(1234); // TODO
});
});
});
typeof
检查将成功,您的代码会将Date.now函数设置为新实现。由于这不是茉莉花间谍,你必须自己清理(因此afterEach
)。该规范仍然没有完全通过,因为它没有正确地对Date
构造函数进行存根。