Jasmine:使用callFake后,你怎么能恢复到原来的功能?

时间:2017-01-08 02:10:12

标签: javascript jasmine

说你有spyOn(obj, 'method').and.callFake(fn);。您如何随后将obj.method恢复为原始功能?

使用案例:如果你在一个大的callFake中进行beforeEach并希望将原始方法用于其中一个测试用例,而在其余测试用例中使用假方法。

test.js

var obj = {
    method: function () {
        return 'original';
    },
}

module.exports = obj;

testSpec.js

var obj = require('../test.js');

describe('obj.method', function () {
    it('should return "original" by default', function () {
    expect(obj.method()).toBe('original');
  });

  it('should return "fake" when faked', function () {
    spyOn(obj, 'method').and.callFake(function () {
      return 'fake';
    });

    expect(obj.method()).toBe('fake');
  });

  it('should return "original" when reverted after being faked', function () {
    spyOn(obj, 'method').and.callFake(function () {
      return 'fake';
    });

    // what code can be written here to get the test to pass?

    expect(obj.method()).toBe('original');
  });
});

我正在使用Jasmine v2.5.2。

编辑:嗯,我想你可以写:

obj.method = function () {
  return 'original';
};

但这感觉太不干了。是否有基于茉莉花的东西,如obj.method.revertToOriginal()

1 个答案:

答案 0 :(得分:2)

您可以在spied方法上调用callThrough()将其恢复为基本功能。

var obj = {
  method: function() {
    return 'original'
  }
}

describe('obj.method', function() {
  it('should return "original" by default', function() {
    expect(obj.method()).toBe('original');
  });

  it('should return "fake" when faked', function() {
    spyOn(obj, 'method').and.callFake(function() {
      return 'fake';
    });

    expect(obj.method()).toBe('fake');
  });

  it('should return "original" when reverted after being faked', function() {
    spyOn(obj, 'method').and.callFake(function() {
      return 'fake';
    });

    obj.method.and.callThrough() // method for revert spy

    expect(obj.method()).toBe('original');
  });
});
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" />
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script>