首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jasmine -如何spyOn实例方法

Jasmine -如何spyOn实例方法
EN

Stack Overflow用户
提问于 2015-07-12 14:07:04
回答 2查看 28.6K关注 0票数 32

我有一个函数

代码语言:javascript
复制
var data = {};
var myFunc = function() {
  data.stuff = new ClassName().doA().doB().doC();
};

我想测试一下doAdoBdoC是否都被调用了。

我尝试过像这样监视实例方法

代码语言:javascript
复制
beforeEach(function() {
  spyOn(ClassName, 'doA');
};
it('should call doA', function() {
  myFunc();
  expect(ClassName.doA).toHaveBeenCalled();
});

但这只会给我一个"doA()方法不存在“的错误。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-12 14:27:18

您的错误之处在于您对如何在静态上下文中引用JavaScript中的方法的理解。您的代码实际在做的是监视ClassName.doA (即,作为属性doA附加到ClassName构造函数的函数,这不是您想要的)。

如果您想要检测在ClassName anywhere的任何实例上调用该方法的时间,则需要监视原型。

代码语言:javascript
复制
beforeEach(function() {
  spyOn(ClassName.prototype, 'doA');
});
it('should call doA', function() {
  myFunc();
  expect(ClassName.prototype.doA).toHaveBeenCalled();
});

当然,这是假设doA存在于原型链中。如果它是own property,那么如果不能在myFunc中引用匿名对象,就没有什么技术可以使用。如果您能够访问myFunc中的ClassName实例,那将是最理想的,因为您可以直接spyOn该对象。

另外,你真的应该把“茉莉花”放在标题里。

票数 51
EN

Stack Overflow用户

发布于 2015-07-12 15:57:17

让我们做一些代码重构,因为我们想实现构造函数注入模式,正如James Shore提到的那样:

依赖注入意味着为对象提供自己的实例变量。真的。就这样。

代码语言:javascript
复制
var data = {};
var stuff = new ClassName()

var myFunc = function(stuff) { // move step of creation new object outside
  data.stuff = stuff.doA().doB().doC();
};

和一些测试的时间

代码语言:javascript
复制
function ClassName() {
}

var data = {};
var stuff = new ClassName()

var myFunc = function(stuff) {
  data.stuff = stuff.doA().doB().doC();
};


describe('stub for ClassName implementation', function() {
  var stubStuff = {
    doA: function() {
      return stubStuff
    },
    doB: function() {
      return stubStuff
    },
    doC: function() {
      return stubStuff
    }
  }

  beforeEach(function() {
    spyOn(stubStuff, 'doA').and.callThrough();
  });

  it('calls "doA" on "myFunc" exection', function() {
    myFunc(stubStuff);
    expect(stubStuff.doA).toHaveBeenCalled();
  });
});
代码语言:javascript
复制
<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>

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31364930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档