Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Sinon.js模拟Jquery事件_Javascript_Jquery_Mocha.js_Sinon Chai - Fatal编程技术网

Javascript 使用Sinon.js模拟Jquery事件

Javascript 使用Sinon.js模拟Jquery事件,javascript,jquery,mocha.js,sinon-chai,Javascript,Jquery,Mocha.js,Sinon Chai,我有下面的javascript模块,当用户单击BacktoTop按钮时,它会设置动画并将页面移动到顶部 const jsdom = require("jsdom"); const { JSDOM } = jsdom; const { window } = new JSDOM(`...`); var $ = require("jquery")(window); const BackToTop = (funct

我有下面的javascript模块,当用户单击BacktoTop按钮时,它会设置动画并将页面移动到顶部

    const jsdom = require("jsdom");
    const { JSDOM } = jsdom;
    const { window } = new JSDOM(`...`);
    var $ = require("jquery")(window);
    
    const BackToTop = (function () {
      var baclTop = () => {
        $(".back").on("click", BackToTop.animate);
      };
      var animate = function () {
        $("html, body").animate({ scrollTop: "0" }, 1000);
      };
    
      return {
        baclTop,
        animate,
      };
    })();
    
    module.exports = BackToTop;
我已经使用mocha和sinon.js编写了以下测试用例,但是我得到了以下错误

const BackToTop = require("../src/backToTop");
const sinon = require("sinon");
const jsdom = require("jsdom");
const document = new jsdom.JSDOM("<html></html>", {});
const window = document.defaultView;
global.document = document;
global.window = window;
const { expect } = require("chai");

describe("Name of the group", () => {
  it("should ", (done) => {
    $("body").append("<div class='sd-back-to-top'>hello world</div>");
    const operation = sinon.spy(BackToTop, "animate");

    $(".back").trigger('click');
    BackToTop.baclTop();
    expect(operation.callCount).to.be.eq(1);
    done();
  });
});
AssertionError: expected 0 to equal 1
    at Context.<anonymous> (test\backToTop.spec.js:17:39)
    at processImmediate (internal/timers.js:461:21)

+ expected - actual

-0
+1
const BackToTop=require(“../src/BackToTop”);
const sinon=要求(“sinon”);
const jsdom=require(“jsdom”);
const document=new jsdom.jsdom(“,{});
const window=document.defaultView;
global.document=文件;
global.window=窗口;
const{expect}=require(“chai”);
描述(“组名”,()=>{
它(“应该”,“完成)=>{
$(“正文”)。追加(“你好世界”);
const operation=sinon.spy(BackToTop,“animate”);
$(“.back”).trigger('click');
BackToTop.baclTop();
expect(operation.callCount).to.be.eq(1);
完成();
});
});
AssertionError:0应等于1
在上下文中。(测试\backToTop.spec.js:17:39)
在processImmediate(internal/timers.js:461:21)
+预期-实际
-0
+1
我已经尝试了很多文章,但没有运气


提前谢谢

BackToTop模块有两个私有(作用域)功能:
baclTop
animate

公开它们时,您将声明附加到模块的另外两个函数:

return {
    baclTop, // shortcut for baclTop: baclTop
    animate,
}
因此,当您创建spy时,sinon会将函数暴露函数包装在返回框中:

const operation = sinon.spy(BackToTop, "animate");
但是,当您调用
BackToTop.baclTop()
时,这将调用
animate
函数的“内部”版本,sinon无法拦截此调用


你不能这样做,你必须以可测试的方式重写你的代码,或者只监视你直接调用的函数。

我在测试中看不到$variablecode@lifeisfoo$在全球范围内可用。问题在于测试中为什么同时调用触发器和backlTop?您是否曾尝试在1s超时内包装expect和done调用,只是为了检查触发器执行是否是排队的异步操作?我尝试了这两种方法,但都没有成功您能否在github上上载一个完整的不工作示例?