【问题标题】:Jasmine spy expects to be called with "Object(...)"Jasmine spy 期望用“Object(...)”调用
【发布时间】:2015-07-23 22:28:42
【问题描述】:

我正在完成从 Jasmine 1.3 到 2.0 的迁移。到目前为止,我已经重构了大部分代码以符合 2.0 的新语法。但是,某些类型的测试仍然失败。

简而言之,我的测试是这样的:

var obj = new CustomCriteria();

spyOn(my, "function");
my.function(obj);
expect(my.function).toHaveBeenCalledWith({ big: "fat object" });

我的CustomCriteria 班级:

var CustomCriteria = function() {
    this.big = "fat object";
};

测试失败并显示以下内容:

Expected spy function to have been called with [ Object({ big: "fat object" }) ] but actual calls were [ ({ big: "fat object" }) ].

请注意期望如何有一个“Object”围绕它,但第二个没有。这个测试在 Jasmine 的

更新:我尝试通过new 使用function 与对象文字语法创建一个新对象,看来__proto__s 是不同的。也许这会影响 Jasmine 的平等比较?

【问题讨论】:

  • 你能创建一个新的 CustomCriteria 并通过它吗?
  • 既然您的测试范围内拥有所有必要的资源,您不妨检查一下.toHaveBeenCalledWith(obj)

标签: javascript angularjs testing jasmine


【解决方案1】:

在版本 2 之前,如果对象具有相同的属性和值,则它们是相等的(请参阅v1.3.1 code

从版本 2 开始,还会比较对象构造函数(请参阅v2.0 code)。

在您的情况下:CustomCriteria{} 没有相同的构造函数。

P.S.:异常消息也更改为包含构造函数名称。

【讨论】:

    【解决方案2】:
    var x = {a:1}; var y ={a:1};
    

    x 和 y 在 jasmine 中比较失败(我相信它使用 ===),因为 x 和 y 只是对对象字面量的引用。

    expect(my.function).toHaveBeenCalledWith(obj) 不会失败,因为对象引用会匹配。如果您没有要比较的确切对象引用,您可以使用 my.function.calls 检查调用的 args 以检查某些字段的相等性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 2021-04-02
      • 2021-02-12
      • 1970-01-01
      • 2020-03-18
      • 2017-04-21
      • 2020-10-26
      相关资源
      最近更新 更多