【问题标题】:Sinon TypeError: Attempted to wrap undefined property getInternationals as functionSinon TypeError:试图将未定义的属性 getInternationals 包装为函数
【发布时间】:2020-07-19 18:00:59
【问题描述】:

我正在使用 Cypress 编写集成测试。 Cypress 使用 Sinon 作为存根和间谍,所以 cy.spy = sinon.spy。

我正试图从导入的模块中窥探一个方法。

我正在像这样导入模块:import * as internationals from "../../../src/api/Internationals";

然后我尝试监视api/Internationals 中的一个方法,如下所示:cy.spy(internationals, "getInternationals");

导致这个错误:

TypeError: Attempted to wrap undefined property getInternationals as function

api/Internationals.js的内容:

import ApiClient from "./ApiClient";

export const getInternationals = ({ search, team, from, till, page = 1, per_page = 10, sort_column, sort_direction }) =>
  ApiClient.get(`/players`, {
    params: {
      search: search ? (search === "#" ? "hek" : search) : null,
      team: team ? team : null,
      from: from ? from : null,
      till: till ? till : null,
      page: page,
      per_page: per_page,
      sort_column: sort_column ? sort_column : null,
      sort_direction: sort_direction ? sort_direction : null
    }
  });

测试内容:

/// <reference types="Cypress" />

import * as internationals from "../../../src/api/Internationals";

describe("Can search for internationals", () => {
  it("Remembers filters after refreshing", () => {
    console.log(internationals);
    cy.spy(internationals, "getInternationals");

    expect(internationals.getInternationals).to.be.called;
  });
});

控制台日志internationals 显示:

我错过了什么吗?

【问题讨论】:

  • console.log(internationals) 打印什么?
  • 我添加了截图@glebbahmutov
  • 奇怪的是同时存在getInternationals 和getter 属性get getInternationals
  • 是的,我不知道为什么会这样
  • getInternationals 在控制台中显示工具提示“调用属性获取器”。 get getInternationals 引用似乎是 getter 函数本身,您可以通过 const getterFunction = Object.getOwnPropertyDescriptor(internationals, "getInternationals").get; 访问它。

标签: javascript testing integration-testing sinon cypress


【解决方案1】:

通过控制台中的错误进行跟踪,很明显赛普拉斯没有正确处理export const getInternationals 构造,但一目了然无法说明原因。


注意:重新建立导入的基础不起作用,留待继续讨论

你可以通过在你的测试中像这样窥探来躲避问题

const spyBase = {
  getInternationals: internationals.getInternationals
}
cy.spy(spyBase, "getInternationals");

expect(spyBase.getInternationals).to.be.called;

如果您可以更改源代码,请将默认导出添加到模块

export const getInternationals = ...

export default {
  getInternationals
}

然后像这样导入它

import internationals from "../../../src/api/Internationals";

【讨论】:

  • 感谢您的回复!我正在尝试第一个选项,它不再抛出原始错误,所以这是一个进步,但现在它说它永远不会被调用,尽管我确信这是因为我可以在网络选项卡中看到 api 调用。我也尝试将间谍移动到调用访问之前,但它没有任何区别:(
  • 很抱歉。有时很难完全模拟一个问题场景,所以我跳过了实际测试调用。向函数添加 spy 只是添加了一个包装函数,但显然需要在应用程序和规范中导入一个公共基础对象。
  • 这看起来像是一个前进的方向Sinon spies - “使用间谍包装属性 getter 和 setter”部分,但似乎赛普拉斯检查不考虑 getter 属性(不确定这是否是Cypress 问题或 Sinon 问题)。
  • 另一个想法——既然getInternationals 只是调用APIClient,你能用cy.spy(APIClient, "get") 代替吗?
猜你喜欢
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2021-09-30
相关资源
最近更新 更多