javascript - 为什么 jasmine spy 不通过引用解析函数对象?

标签 javascript angularjs jasmine

我有以下简单的服务

app.factory('Shoes', function() {
    function a() {return 12;}
    function b() {return a();}

    return {
      a: a,
      b: b
    }
  })

我想在调用方法b 时测试方法a 是否被调用。我的测试看起来像这样:

describe('Testing a Shoes service', function() {
  var service;

  beforeEach(module('plunker'));

  beforeEach(inject(function(Shoes) {
    service = Shoes;
  }))

  it('.b should call .a', function() {
    spyOn(service, 'a');
    service.b();
    expect(service.a).toHaveBeenCalled();
  })

});

但是测试失败了。相关的 plunker 是 here .我已经知道如何解决来自 those answers 的 plunker 中的问题.还有一个 Unresolved 问题:

为什么原始函数对象没有被解析?

我认为系统是这样工作的(假设 spy 用额外的逻辑装饰函数)

当我调用 service.a 时没有 spy ,它被解析为:

A) service.a -> a()

当我创建一个 spy 时,它会装饰函数

B) spy -> service.a => service.a*()

但是 service.a 基本上是对原始 a() 的引用,所以我们最后应该有一个用于解析函数对象的 spy 集:

A + B => spy -> service.a -> a => a*()

最佳答案

调用 spyOn(service, 'a') 后,service.a 不再是您在函数中定义的 a - - 这是一个 spy 功能。那个 spy 函数恰好调用了a,但它不是a;它具有不同的身份和不同的功能。

但是,设置 servicea 属性不会更改您在 app.factory 中声明的 functiona >。您只是更改了 service,使其 a 属性不再引用您原来的 a。相比之下,您的 b 函数永远不会更改其对原始 a 的引用。它直接从本地 app.factory 作用域获取 aab 最初是在该作用域中声明的。 service 用 spy 替换它原来的 a 的事实并不影响 ba() 的调用,因为它不引用 service.a

关于javascript - 为什么 jasmine spy 不通过引用解析函数对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222909/

相关文章:

javascript - DOM 对象是 javascript 对象吗?

javascript - <tr> 动态表中的下拉问题。网页/PHP

javascript - 如何在 angular.js 指令中使用调用元素的文本?

javascript - uibModal 提供者未知 unitTest

Javascript裁剪图像客户端

javascript - 如何在 JavaScript Regex 中使用/不使用负前瞻来匹配带有标记的文本表达式

angularjs - 上传到服务器之前是否可以重命名文件?

javascript - Angular 认证

angular - Jasmine : Spying an exported function that is called by an another function doesn't work

javascript - .then() 中的 Expect() - Jasmine 单元测试,AngularJS