SpyOn并返回Jasmine中未定义对象的类型

时间:2014-02-07 00:25:18

标签: unit-testing tdd jasmine

我有一个在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。

2 个答案:

答案 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构造函数进行存根。