Javascript 使用Sinon.js模拟Jquery事件
我有下面的javascript模块,当用户单击BacktoTop按钮时,它会设置动画并将页面移动到顶部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
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上上载一个完整的不工作示例?