Sinon.JS 嘲讽混乱 1. sinon.replace(jQuery, "ajax", sinon.fake());2. getTodos(42, sinon.fake());3.断言(jQuery.ajax.CalledWithMatch({ url: "/todo/42/items" }));总结

如何解决Sinon.JS 嘲讽混乱 1. sinon.replace(jQuery, "ajax", sinon.fake());2. getTodos(42, sinon.fake());3.断言(jQuery.ajax.CalledWithMatch({ url: "/todo/42/items" }));总结

我正在尝试学习如何使用 Sinon、Mocha 和 Chai 进行 JS 单元测试。现在,我想确认我的一个函数实际上发出了一个 api 请求(所以我需要模拟我的函数)。我相信我在 Sinon 文档(它是用于测试 Ajax 的代码)中找到了相关的模拟代码,但是,我无法理解发生了什么(文档非常稀疏)。谁能解释一下 it 函数中的 3 行代码(直接在下面)?

it("makes a GET request for todo items",function () {
  sinon.replace(jQuery,"ajax",sinon.fake());

  getTodos(42,sinon.fake());

  assert(jQuery.ajax.calledWithMatch({ url: "/todo/42/items" }));

作为参考,被模拟的函数如下:

function getTodos(listId,callback) {
  jQuery.ajax({
    url: "/todo/" + listId + "/items",success: function (data) {
      // Node-style cps: callback(err,data)
      callback(null,data);
    },});
}

此外,这里是文档的链接https://sinonjs.org/

解决方法

让我们一步一步来:

1. sinon.replace(jQuery,"ajax",sinon.fake());

Sinon 创建了一个新的 fake 函数并用它替换了 jQuery.ajax 函数。

jQuery.ajax 的任何其他调用都将调用伪造。默认情况下,fake 函数返回 undefined,您也可以控制它;但这里不需要它(因为我们将断言是否使用某些参数调用它)。 fake 函数与 spies 具有相同的方法,因此一个 fake 函数将记录有关其调用的信息,例如 spies。 (是否调用,使用哪些参数等)

2. getTodos(42,sinon.fake());

getTodos 是被测试的函数。这将使用 42 作为第一个参数和一个新的伪函数作为第二个参数(回调参数)调用它。

可能是为了防止使用实际回调的副作用而传递了一个假值。也可以放一个空函数,比如

getTodos(42,() => {});

回调函数对于本次测试无关紧要。它只需要被丢弃/嘲笑。

3.断言(jQuery.ajax.CalledWithMatch({ url: "/todo/42/items" }));

断言检查表达式 jQuery.ajax.calledWithMatch({ url: "/todo/42/items" }) 是否为真。请记住,jQuery.ajax 被替换为假函数。因此,调用了伪函数的 calledWithMatch 方法。根据 CalledWithMatch 的文档(在间谍部分):

spy.calledWithMatch(arg1,arg2,...);
Returns true if spy was called with matching arguments (and possibly others).

This behaves the same as spy.calledWith(sinon.match(arg1),sinon.match(arg2),...).

因此,如果使用匹配的参数(此处仅提供一个)调用假函数,则返回 true。 “匹配”行为通过 matchers 定义。这里使用了对象匹配器(sinon.match(object)),如果

匹配
sinon.match(object);
Requires the value to be not null or undefined and have at least the same properties as expectation.

This supports nested matchers.

所以,这个对象在getTodo中传递给jQuery.ajax:

{
    url: "/todo/42/items",success: function (data) {
      callback(null,data);
    },}

哪个匹配

{ url: "/todo/42/items" }

根据对象匹配器定义。因此,此匹配器检查是否使用包含值为 "/todo/42/items" 的 url 属性的对象调用 jQuery.ajax 方法。

总结

  1. 首先我们模拟了 jQuery.ajax,因为我们不想发出实际请求,只想检查它是否被调用。
  2. 我们调用 getTodos,这是我们的测试对象,带有 42 和一个假回调参数。
  3. 我们期望使用具有值为“/todo/42/items”的 url 属性的对象调用 jQuery.ajax

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?