当前位置: 首页 > 知识库问答 >
问题:

sinon库的假、间谍、存根和模拟之间的差异(sinon假、间谍、存根和模拟)

许正平
2023-03-14

我试图理解西农图书馆的假、间谍、存根和模拟之间的区别,但无法清楚地理解。

有人能帮我了解一下吗?

共有2个答案

夏侯航
2023-03-14

为了给这个好答案添加更多的信息,我们在Sinon中添加了假的API,因为其他原始API(存根和间谍)存在缺陷。这些API是可链接的,这一事实导致了不断的设计问题和反复出现的用户问题,并且它们过于臃肿,以满足非常不重要的用例,这就是为什么我们选择创建一个新的不可变API,该API使用更简单,不那么含糊,维护成本更低。它是在Spy和Stub API的基础上构建的,以使赝品在某种程度上可以识别,并具有替换对象上道具的明确方法(sinon.replace(obj,'prop',fake))。

假货基本上可以在任何可以使用存根或间谍的地方使用,所以我自己已经有3-4年没有使用旧的API了,因为使用更有限假货的代码对其他人来说更容易理解。

司徒骞尧
2023-03-14

仅为了解目的,请致电:

FuncInfoCollector=是一个函数,用于记录所有调用的参数、返回值、此值(上下文)和引发的异常(如果有)。(此FuncInfoCollector是我提供的假名称,在SINON库中不存在)

Fake=FuncInfoCollector只能创建一个伪函数,它不能包装测试系统中已经存在的函数。

假货是不可变的:一旦创建,行为就无法更改。

var fakeFunc = sinon.fake.returns('foo');
fakeFunc();

// have call count of fakeFunc ( It will show 1 here)
fakeFunc.callCount;   

Spy=FuncInfoCollector可以创建新函数它可以包装测试系统中已经存在的函数。

无论何时,只要测试的目标是验证发生了什么,Spy都是一个不错的选择。

// Can be passed as a callback to async func to verify whether callback is called or not?
const spyFunc = sinon.spy();

// Creates spy for ajax method of jQuery lib
sinon.spy(jQuery, "ajax");       

// will tell whether jQuery.ajax method called exactly once or not 
jQuery.ajax.calledOnce 

Stub=它将Stub原始函数(可用于更改原始函数的行为)。

var err = new Error('Ajax Error');

// So whenever jQuery.ajax method is called in a code it throws this Error
sinon.stub(jQuery, "ajax").throws(err) 

// Here we are writing assert to check where jQuery.ajax is throwing an Error or not
sinon.assert.threw(jQuery.ajax(), err);

Mock=存根预编程期望值。

var mk = sinon.mock(jQuery)

// Should be called atleast 2 time and almost 5 times
mk.expects("ajax").atLeast(2).atMost(5); 

// It throws the following exception when called ( assert used above is not needed now )
mk.expects("ajax").throws(new Error('Ajax Error')) 

// will check whether all above expectations are met or not, hence assertions aren't needed
mk.verify(); 

请也看看这个链接。替换vs sinon。存根只是为了替换返回值?

 类似资料:
  • 我很难找到sinon间谍没有被触发的原因。在下面的测试中,两个控制台语句都报告为false,因此两个方法都没有被调用(以防出现错误)。 这是我的一个摩卡测试通常的样子: }); PostOnToller中的方法: 最后是PostModel中的方法: 如果我以正常的方式调用方法,它们会执行查找,返回预期的Posts数组。但是,不会执行间谍。另外,如果我将控制器类中的方法更改为 间谍函数(res)确实

  • 虽然这个问题已经得到了回答,但我仍然不清楚在嘲弄中应该使用哪一个 当参考。我看不出它们之间有什么区别。 留档为是说 的文档中说 的留档是说 这清楚地表明,这两者之间没有区别。那么,我们为什么要采用这三种嘲弄策略,以及在当时和何时使用它们之间的具体区别。 如果它是一个带有示例代码的答案,那将非常有帮助。

  • 所以我有一个调用https请求的方法。我已经成功地在其他测试中中断了调用,但是这个测试打败了我,因为它根本不起作用。 在我的beforeach中,我创建存根,在我的afterEach中,我执行存根还原 在测试中,我创建了四个存根调用。

  • 我在获取一个sinon存根以返回/解析另一个sinon存根时遇到问题。我正在使用西农、柴、柴和摩卡。 我正在按顺序执行许多异步任务,我想测试的代码看起来像这样: 我尝试为此创建存根的尝试如下所示: “saveit”方法在Terminal.prototype,这就是为什么我需要在那里存根它。当我尝试运行它时,我收到错误消息: 在线上: 但如果我在控制台中转储终端对象,它看起来很好,就像任何其他存根对

  • 我正在尝试测试一个es6类,但我不知道如何用sinon存根一个函数模块。测试不是sm下的覆盖线。callSoap函数 我试试这个: module.js index.js(这是模块的索引) my-class.js test.js 我尝试在soapModule上存根,但生成了以下错误: 无法存根不存在的自己的属性call Soap

  • 问题内容: 我使用sinon作为对nodejs(Hapijs)功能的单元测试。该函数在index.js中。我在我的测试文件中包含index.js作为 但是再次在index.js里面有要求 再次,library.js需要第三方功能 现在,当我在下面运行我的测试文件testfunc.js时 我收到以下错误 我想知道是否有任何方法可以对index.js的内部require库.stub进行存根(因为ind