Jasmine.js如何对调用未定义函数的函数进行单元测试?

时间:2014-04-18 19:24:34

标签: javascript unit-testing backbone.js jasmine stub

我的函数getLink(rel)调用测试环境中不存在的函数。

getLink: function(rel) {
    var schemaLink = null;
    var schemaLinks = this.collection.getItemSchema().links;
    schemaLinks.forEach(function(link) {
        if(link.rel === rel) {
            schemaLink = link;
            return false;
        }
    });
    return schemaLink;
},

this.collection不存在,我不想测试它,因为我想隔离我正在测试的对象。我如何使用Jasmine 2.0来监视这个函数(或存根,无论做什么,但我认为它是存根)?

1 个答案:

答案 0 :(得分:0)

您可以使用call方法在间谍对象的上下文中调用您的函数。它看起来像这样:

describe('getLink()', function(){
  var result, fooLink, barLink, fakeContext;
  beforeEach(function(){
    fakeContext = {
      collection: jasmine.createSpyObj('collection', ['getItemSchema']);
    };

    fooLink = {rel: 'foo'};
    barLink = {rel: 'bar'};
    fakeContext.collection.getItemSchema.andReturn([fooLink, barLink]);
  });

  desctibe('when schemaLink exists', function(){
    beforeEach(function(){
      result = getLink.call(fakeContext, 'foo')
    });

    it('calls getItemSchame on collection', function(){
      expect(fakeContext.collection.getItemSchame).toHaveBeenCalledWith();
    });

    it('returns fooLink', function(){
      expect(result).toBe(fooLink);
    });
  });

  desctibe('when schemaLink does not exist', function(){
    ...
  });
});