Best JavaScript code snippet using sinon
index.test.js
Source:index.test.js
1jest.mock('../util/get_window');2var getWindowModule = require('../util/get_window');3var scrollRestorer = require('../index');4describe('scroll-restorer', function() {5 beforeEach(function() {6 // Mock the window object.7 jest.spyOn(getWindowModule, 'getWindow').mockReturnValue({8 addEventListener: jest.fn(),9 document: {10 body: {11 scrollHeight: 10012 }13 },14 history: {15 replaceState: jest.fn(),16 scrollRestoration: 'foo',17 state: {18 scroll: {19 x: 0,20 y: 021 }22 }23 },24 location: 'foo',25 pageXOffset: 0,26 pageYOffset: 0,27 removeEventListener: jest.fn(),28 replaceState: jest.fn(),29 // We just invoke requestAnimationFrame functions immediately.30 requestAnimationFrame: function(fn) {31 fn();32 },33 scrollTo: jest.fn()34 });35 });36 afterEach(function() {37 getWindowModule.getWindow.mockRestore();38 });39 describe('start', function() {40 it('adds a scroll event listener', function() {41 scrollRestorer.start();42 var addEventListenerArgs = getWindowModule.getWindow().addEventListener43 .mock.calls[0];44 expect(addEventListenerArgs[0]).toBe('scroll');45 });46 it('adds a scroll event listener with passive option enabled', function() {47 scrollRestorer.start();48 var addEventListenerArgs = getWindowModule.getWindow().addEventListener49 .mock.calls[0];50 expect(addEventListenerArgs[2]).toEqual({ passive: true });51 });52 it('adds a popstate event listener when autoRestore option is omitted', function() {53 scrollRestorer.start();54 // We should have attached popstate and scroll event listeners.55 expect(56 getWindowModule.getWindow().addEventListener57 ).toHaveBeenCalledTimes(2);58 // Find the popstate addEventListener call.59 var popStateListenerCall = getWindowModule60 .getWindow()61 .addEventListener.mock.calls.filter(function(callArgs) {62 return callArgs[0] === 'popstate';63 });64 expect(popStateListenerCall.length).toBe(1);65 });66 it('does not add a popstate event listener when autoRestore option is false', function() {67 scrollRestorer.start({ autoRestore: false });68 // We should have attached only a scroll listener.69 expect(70 getWindowModule.getWindow().addEventListener71 ).toHaveBeenCalledTimes(1);72 // We should not have attached a popstate listener.73 var addEventListenerArgs = getWindowModule.getWindow().addEventListener74 .mock.calls[0];75 expect(addEventListenerArgs[0]).not.toBe('popstate');76 });77 it('sets history.scrollRestoration to manual if property exists', function() {78 expect(getWindowModule.getWindow().history.scrollRestoration).toEqual(79 'foo'80 );81 scrollRestorer.start();82 expect(getWindowModule.getWindow().history.scrollRestoration).toEqual(83 'manual'84 );85 });86 it('does not set history.scrollRestoration if property does not exists', function() {87 delete getWindowModule.getWindow().history.scrollRestoration;88 scrollRestorer.start();89 expect(getWindowModule.getWindow().history.scrollRestoration).toEqual(90 undefined91 );92 });93 });94 describe('captureScroll', function() {95 beforeEach(function() {96 jest.useFakeTimers();97 });98 afterEach(function() {99 jest.useRealTimers();100 });101 it('calls #replaceState if the saved offset values have changed', function() {102 // We're pretending that the user scrolled the window by 20px on both axes.103 getWindowModule.getWindow().pageXOffset = 20;104 getWindowModule.getWindow().pageYOffset = 20;105 scrollRestorer.start();106 var addEventListenerArgs = getWindowModule.getWindow().addEventListener107 .mock.calls[0];108 // Let's verify that this is the scroll event listener.109 expect(addEventListenerArgs[0]).toEqual('scroll');110 // Let's invoke the debounced event handler directly.111 addEventListenerArgs[1]();112 // We fake the passage of time to invoke our debounced function.113 jest.runAllTimers();114 // Assert that replaceState was invoked with the "new" scroll offset values.115 expect(116 getWindowModule.getWindow().history.replaceState117 ).toHaveBeenCalledWith(118 { scroll: { x: 20, y: 20 } },119 null,120 getWindowModule.getWindow().location121 );122 });123 it('does not call #replaceState if the saved offset values have not changed', function() {124 scrollRestorer.start();125 var addEventListenerArgs = getWindowModule.getWindow().addEventListener126 .mock.calls[0];127 // Let's verify that this is the scroll event listener.128 expect(addEventListenerArgs[0]).toEqual('scroll');129 // Let's invoke the debounced event handler directly.130 addEventListenerArgs[1]();131 // We fake the passage of time to invoke our debounced function.132 jest.runAllTimers();133 expect(134 getWindowModule.getWindow().history.replaceState135 ).not.toHaveBeenCalled();136 });137 });138 describe('getSavedScroll', function() {139 it('returns value from provided input', function() {140 expect(scrollRestorer.getSavedScroll({ state: { scroll: 'foo' } })).toBe(141 'foo'142 );143 });144 it('returns value from window.history when input is not defined', function() {145 expect(scrollRestorer.getSavedScroll()).toEqual({ x: 0, y: 0 });146 });147 it('returns undefined when input.state is undefined', function() {148 expect(scrollRestorer.getSavedScroll({ foo: 'bar' })).toEqual(undefined);149 });150 });151 describe('restoreScroll', function() {152 it('calls #scrollTo with a position retrieved from state in window.history', function() {153 // We're pretending that a scroll position has been saved previously.154 getWindowModule.getWindow().history.state.scroll = { x: 0, y: 20 };155 scrollRestorer.restoreScroll();156 expect(getWindowModule.getWindow().scrollTo).toHaveBeenCalledWith(0, 20);157 });158 it('calls #scrollTo with a position retrieved from a popstate event', function() {159 var popstateEvent = { state: { scroll: { x: 0, y: 40 } } };160 scrollRestorer.restoreScroll(popstateEvent);161 expect(getWindowModule.getWindow().scrollTo).toHaveBeenCalledWith(0, 40);162 });163 it('does not call #scrollTo when unnecessary', function() {164 // We're pretending that the user scrolled the window by 20px on the y axis.165 getWindowModule.getWindow().pageXOffset = 0;166 getWindowModule.getWindow().pageYOffset = 20;167 // We're pretending that the same scroll position has already been saved.168 getWindowModule.getWindow().history.state.scroll = { x: 0, y: 20 };169 scrollRestorer.start();170 scrollRestorer.restoreScroll();171 scrollRestorer.end();172 expect(getWindowModule.getWindow().scrollTo).not.toHaveBeenCalled();173 });174 it('returns early if no saved scroll positions exist', function() {175 getWindowModule.getWindow().requestAnimationFrame = jest.fn();176 scrollRestorer.restoreScroll({ foo: 'bar' });177 expect(178 getWindowModule.getWindow().requestAnimationFrame179 ).not.toHaveBeenCalled();180 });181 });182 describe('end', function() {183 it('removes the scroll event listener with identical arguments', function() {184 scrollRestorer.start();185 scrollRestorer.end();186 var addEventListenerArgs = getWindowModule.getWindow().addEventListener187 .mock.calls[0];188 var removeEventListenerArgs = getWindowModule.getWindow()189 .removeEventListener.mock.calls[0];190 // Let's verify that this is the scroll event listener.191 expect(addEventListenerArgs[0]).toEqual('scroll');192 // Let's verify that our handler function is === when adding and removing.193 expect(addEventListenerArgs[1]).toBe(removeEventListenerArgs[1]);194 expect(addEventListenerArgs).toEqual(removeEventListenerArgs);195 });196 it('removes the popstate event listener with identical arguments', function() {197 scrollRestorer.start({ autoRestore: true });198 scrollRestorer.end();199 var addEventListenerArgs = getWindowModule.getWindow().addEventListener200 .mock.calls[1];201 var removeEventListenerArgs = getWindowModule.getWindow()202 .removeEventListener.mock.calls[1];203 // Let's verify that this is the popstate event listener.204 expect(addEventListenerArgs[0]).toEqual('popstate');205 // Let's verify that our handler function is === when adding and removing.206 expect(addEventListenerArgs[1]).toBe(removeEventListenerArgs[1]);207 expect(addEventListenerArgs).toEqual(removeEventListenerArgs);208 });209 });...
ExifRestorer.js
Source:ExifRestorer.js
1//Based on MinifyJpeg2//http://elicon.blog57.fc2.com/blog-entry-206.html3qq.ExifRestorer = (function()4{5 6 var ExifRestorer = {};7 8 ExifRestorer.KEY_STR = "ABCDEFGHIJKLMNOP" +9 "QRSTUVWXYZabcdef" +10 "ghijklmnopqrstuv" +11 "wxyz0123456789+/" +12 "=";13 ExifRestorer.encode64 = function(input)14 {15 var output = "",16 chr1, chr2, chr3 = "",17 enc1, enc2, enc3, enc4 = "",18 i = 0;19 do {20 chr1 = input[i++];21 chr2 = input[i++];22 chr3 = input[i++];23 enc1 = chr1 >> 2;24 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);25 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);26 enc4 = chr3 & 63;27 if (isNaN(chr2)) {28 enc3 = enc4 = 64;29 } else if (isNaN(chr3)) {30 enc4 = 64;31 }32 output = output +33 this.KEY_STR.charAt(enc1) +34 this.KEY_STR.charAt(enc2) +35 this.KEY_STR.charAt(enc3) +36 this.KEY_STR.charAt(enc4);37 chr1 = chr2 = chr3 = "";38 enc1 = enc2 = enc3 = enc4 = "";39 } while (i < input.length);40 return output;41 };42 43 ExifRestorer.restore = function(origFileBase64, resizedFileBase64)44 {45 var expectedBase64Header = "data:image/jpeg;base64,";46 if (!origFileBase64.match(expectedBase64Header))47 {48 return resizedFileBase64;49 } 50 51 var rawImage = this.decode64(origFileBase64.replace(expectedBase64Header, ""));52 var segments = this.slice2Segments(rawImage);53 54 var image = this.exifManipulation(resizedFileBase64, segments);55 56 return expectedBase64Header + this.encode64(image);57 58 };59 ExifRestorer.exifManipulation = function(resizedFileBase64, segments)60 {61 var exifArray = this.getExifArray(segments),62 newImageArray = this.insertExif(resizedFileBase64, exifArray),63 aBuffer = new Uint8Array(newImageArray);64 return aBuffer;65 };66 ExifRestorer.getExifArray = function(segments)67 {68 var seg;69 for (var x = 0; x < segments.length; x++)70 {71 seg = segments[x];72 if (seg[0] == 255 & seg[1] == 225) //(ff e1)73 {74 return seg;75 }76 }77 return [];78 };79 ExifRestorer.insertExif = function(resizedFileBase64, exifArray)80 {81 var imageData = resizedFileBase64.replace("data:image/jpeg;base64,", ""),82 buf = this.decode64(imageData),83 separatePoint = buf.indexOf(255,3),84 mae = buf.slice(0, separatePoint),85 ato = buf.slice(separatePoint),86 array = mae;87 array = array.concat(exifArray);88 array = array.concat(ato);89 return array;90 };91 92 ExifRestorer.slice2Segments = function(rawImageArray)93 {94 var head = 0,95 segments = [];96 while (1)97 {98 if (rawImageArray[head] == 255 & rawImageArray[head + 1] == 218){break;}99 if (rawImageArray[head] == 255 & rawImageArray[head + 1] == 216)100 {101 head += 2;102 }103 else104 {105 var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3],106 endPoint = head + length + 2,107 seg = rawImageArray.slice(head, endPoint);108 segments.push(seg);109 head = endPoint;110 }111 if (head > rawImageArray.length){break;}112 }113 return segments;114 };115 116 ExifRestorer.decode64 = function(input) 117 {118 var output = "",119 chr1, chr2, chr3 = "",120 enc1, enc2, enc3, enc4 = "",121 i = 0,122 buf = [];123 // remove all characters that are not A-Z, a-z, 0-9, +, /, or =124 var base64test = /[^A-Za-z0-9\+\/\=]/g;125 if (base64test.exec(input)) {126 throw new Error("There were invalid base64 characters in the input text. " +127 "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='");128 }129 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");130 do {131 enc1 = this.KEY_STR.indexOf(input.charAt(i++));132 enc2 = this.KEY_STR.indexOf(input.charAt(i++));133 enc3 = this.KEY_STR.indexOf(input.charAt(i++));134 enc4 = this.KEY_STR.indexOf(input.charAt(i++));135 chr1 = (enc1 << 2) | (enc2 >> 4);136 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);137 chr3 = ((enc3 & 3) << 6) | enc4;138 buf.push(chr1);139 if (enc3 != 64) {140 buf.push(chr2);141 }142 if (enc4 != 64) {143 buf.push(chr3);144 }145 chr1 = chr2 = chr3 = "";146 enc1 = enc2 = enc3 = enc4 = "";147 } while (i < input.length);148 return buf;149 };150 151 return ExifRestorer;...
restorer.js
Source:restorer.js
1"use strict";2/*3This file is part of the ONLINE WARBAND CREATOR (https://github.com/suppenhuhn79/sbhowc)4Copyright 2021 Christoph Zager5Licensed unter the GNU Affero General Public License, Version 36See the full license text at https://www.gnu.org/licenses/agpl-3.0.en.html7 */8var restorer = {};9restorer.sort =10{11 field: "last-modified",12 direction: 113};14restorer.show = function ()15{16 owc.ui.showBluebox(document.getElementById("restorer"));17 restorer.listStoredData();18};19restorer.close = () => owc.ui.sweepVolatiles();20restorer.getSelectedPid = function ()21{22 let selectedItem = document.getElementById("restorer-table-frame").querySelector(".selected");23 return (!!selectedItem) ? selectedItem.getAttribute("data-id") : null;24};25restorer.storageItemClick = function (clickEvent)26{27 let selectedItem = document.getElementById("restorer-table-frame").querySelector(".selected");28 if (!!selectedItem)29 {30 selectedItem.classList.remove("selected");31 };32 clickEvent.target.closest("tr[data-id]").classList.add("selected");33};34restorer.restoreClick = function (clickEvent)35{36 let selectedPid = restorer.getSelectedPid();37 if (!!selectedPid)38 {39 restorer.close();40 let warbandCode = JSON.parse(localStorage.getItem(selectedPid)).data;41 owc.importWarband(warbandCode);42 /* unselect everything in document, some browsers interpret a dblclk as intend to select anything */43 if (typeof window.getSelection === "function")44 {45 window.getSelection().removeAllRanges();46 }47 else if (typeof document.selection === "funtion")48 {49 document.selection.empty();50 };51 };52};53restorer.discardClick = function (clickEvent)54{55 clickEvent.stopPropagation();56 let selectedPid = restorer.getSelectedPid();57 if (!!selectedPid)58 {59 localStorage.removeItem(selectedPid);60 let deletedBubble = document.getElementById("deletedBubble");61 deletedBubble.style.left = Math.floor(document.querySelector("#restorer input[value=\"discard\"]").getBoundingClientRect().x - document.getElementById("restorer").getBoundingClientRect().x) + "px";62 owc.ui.showNotification(deletedBubble);63 restorer.listStoredData();64 };65};66restorer.tableheaderClick = function (clickEvent)67{68 let sortField = clickEvent.target.getAttribute("data-sortfield");69 if (restorer.sort.field === sortField)70 {71 restorer.sort.direction = restorer.sort.direction * -1;72 }73 else74 {75 restorer.sort.field = sortField;76 restorer.sort.direction = 1;77 };78 restorer.listStoredData();79};80restorer.listStoredData = function ()81{82 function _naturalPast(pastDate)83 {84 const wordings = ["just now", "{{n}} minutes ago", "{{6}} hours ago"];85 const dayWordings = ["today", "yesterday", "two days ago"];86 let result = "";87 let now = new Date();88 let maxHours = Number(/\{{2}(\d+)\}{2}/.exec(wordings[2])[1]);89 let secondsDiff = (now.getTime() - pastDate.getTime()) / 1000;90 let diff =91 {92 minutes: secondsDiff / 60,93 hours: secondsDiff / 60 / 60,94 days: Math.floor((Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()) - Date.UTC(pastDate.getFullYear(), pastDate.getMonth(), pastDate.getDate())) / (1000 * 60 * 60 * 24))95 };96 if (secondsDiff < 60)97 {98 result = wordings[0];99 }100 else if (diff.minutes < 60)101 {102 result = wordings[1].replace(/\{{2}.\}{2}/, Math.floor(diff.minutes));103 }104 else if (diff.hours < maxHours)105 {106 result = wordings[2].replace(/\{{2}.\}{2}/, Math.floor(diff.hours));107 }108 else if (diff.days < dayWordings.length)109 {110 result = dayWordings[diff.days] + " " + pastDate.toIsoFormatText("HN");111 }112 else113 {114 result = pastDate.toIsoFormatText();115 };116 return result;117 };118 function _getLocalStorageData()119 {120 let result = [];121 for (let key in localStorage)122 {123 if (/^(?=\D*\d)[\d\w]{6}$/.test(key) === true)124 {125 let storedData = JSON.parse(localStorage[key]);126 let lastModifiedDate = new Date().fromIsoString(storedData.date);127 result.push(128 {129 pid: key,130 'warband-name': storedData.title,131 'figure-count': storedData["figure-count"],132 points: storedData.points,133 'last-modified': lastModifiedDate,134 'last-modified-text': _naturalPast(lastModifiedDate)135 }136 );137 };138 };139 switch (restorer.sort.field)140 {141 case "warband-name":142 result.sort((a, b) => (a["warband-name"].localeCompare(b["warband-name"]) * restorer.sort.direction));143 break;144 default:145 result.sort((a, b) => (((a[restorer.sort.field] < b[restorer.sort.field]) ? 1 : -1) * restorer.sort.direction));146 };147 return result;148 };149 let refNode = document.getElementById("restorer-table-frame");150 let variables =151 {152 'cached-warbands': _getLocalStorageData()153 };154 const thresholdWidth = 400;155 let snippetName = (Number(document.body.clientWidth) <= thresholdWidth) ? "table-frame-small" : "table-frame-normal";156 owc.ui.setElementContent(refNode, pageSnippets.restorer[snippetName].produce(restorer, variables));...
Using AI Code Generation
1var sinon = require('sinon');2var assert = require('assert');3var myObj = {4 myMethod: function () {5 console.log('myMethod was called');6 }7};8var spy = sinon.spy(myObj, 'myMethod');9myObj.myMethod();10assert(spy.called);11spy.restore();12myObj.myMethod();13assert(!spy.called);
Using AI Code Generation
1var sinon = require('sinon');2var obj = {3 method: function () {}4};5var spy = sinon.spy(obj, "method");6obj.method(42);7obj.method.restore();8obj.method(42);
Using AI Code Generation
1var sinon = require('sinon');2var chai = require('chai');3var expect = chai.expect;4describe('Restorer', function () {5 it('should restore the stubbed method', function () {6 var stub = sinon.stub(console, 'log');7 console.log('hello');8 expect(stub.calledOnce).to.be.true;9 stub.restore();10 console.log('hello');11 expect(stub.calledTwice).to.be.false;12 });13});14var sinon = require('sinon');15var chai = require('chai');16var expect = chai.expect;17describe('Restorer', function () {18 it('should restore the stubbed method', function () {19 var stub = sinon.stub(console, 'log');20 console.log('hello');21 expect(stub.calledOnce).to.be.true;22 stub.restore();23 console.log('hello');24 expect(stub.calledTwice).to.be.false;25 });26});27var sinon = require('sinon');28var chai = require('chai');29var expect = chai.expect;30describe('Restorer', function () {31 it('should restore the stubbed method', function () {32 var stub = sinon.stub(console, 'log');33 console.log('hello');34 expect(stub.calledOnce).to.be.true;35 stub.restore();36 console.log('hello');37 expect(stub.calledTwice).to.be.false;38 });39});40var sinon = require('sinon');41var chai = require('chai');42var expect = chai.expect;43describe('Restorer', function () {44 it('should restore the stubbed method', function () {45 var stub = sinon.stub(console, 'log');46 console.log('hello');47 expect(stub.calledOnce).to.be.true;48 stub.restore();49 console.log('hello');50 expect(stub.calledTwice).to.be.false;51 });52});53var sinon = require('sinon');54var chai = require('chai');55var expect = chai.expect;56describe('Restorer', function () {57 it('should restore the stubbed method', function () {58 var stub = sinon.stub(console, 'log');59 console.log('
Using AI Code Generation
1var sinon = require('sinon');2var assert = require('assert');3var myObj = {4 method: function () {5 console.log("Method called");6 }7};8var stub = sinon.stub(myObj, "method");9stub();10stub.restore();11stub();12var sinon = require('sinon');13var assert = require('assert');14var myObj = {15 method: function () {16 console.log("Method called");17 }18};19var stub = sinon.stub(myObj, "method");20stub();21stub.restore();22stub();23var sinon = require('sinon');24var assert = require('assert');25var myObj = {26 method: function () {27 console.log("Method called");28 }29};30var stub = sinon.stub(myObj, "method");31stub();32stub.restore();33stub();34var sinon = require('sinon');35var assert = require('assert');36var myObj = {37 method: function () {38 console.log("Method called");39 }40};41var stub = sinon.stub(myObj, "method");42stub();43stub.restore();44stub();45var sinon = require('sinon');46var assert = require('assert');47var myObj = {48 method: function () {49 console.log("Method called");50 }51};52var stub = sinon.stub(myObj, "method");53stub();54stub.restore();55stub();56var sinon = require('sinon');57var assert = require('assert');58var myObj = {59 method: function () {60 console.log("Method called");61 }62};63var stub = sinon.stub(myObj, "method");64stub();65stub.restore();66stub();67var sinon = require('sinon');68var assert = require('assert');69var myObj = {70 method: function ()
Using AI Code Generation
1const sinon = require('sinon');2const fs = require('fs');3const readFile = sinon.stub(fs, 'readFile');4readFile.withArgs('hello.txt').yields(null, 'Hello');5readFile.withArgs('goodbye.txt').yields(null, 'Goodbye');6sinon.fake.restore();7const sinon = require('sinon');8const fs = require('fs');9const readFile = sinon.stub(fs, 'readFile');10readFile.withArgs('hello.txt').yields(null, 'Hello');11readFile.withArgs('goodbye.txt').yields(null, 'Goodbye');12sinon.fake.restore();13const sinon = require('sinon');14const fs = require('fs');15const readFile = sinon.stub(fs, 'readFile');16readFile.withArgs('hello.txt').yields(null, 'Hello');17readFile.withArgs('goodbye.txt').yields(null, 'Goodbye');18sinon.fake.restore();19const sinon = require('sinon');20const fs = require('fs');21const readFile = sinon.stub(fs, 'readFile');22readFile.withArgs('hello.txt').yields(null, 'Hello');23readFile.withArgs('goodbye.txt').yields(null, 'Goodbye');24sinon.fake.restore();25const sinon = require('sinon');26const fs = require('fs');27const readFile = sinon.stub(fs, 'readFile');28readFile.withArgs('hello.txt').yields(null, 'Hello');29readFile.withArgs('goodbye.txt').yields(null, 'Goodbye');30sinon.fake.restore();31const sinon = require('sinon');32const fs = require('fs');33const readFile = sinon.stub(fs, 'readFile');
Using AI Code Generation
1const sinon = require('sinon');2const assert = require('assert');3const {getUsers} = require('./user');4describe('getUsers', () => {5 it('should return users', () => {6 const stub = sinon.stub().returns([1, 2, 3]);7 const users = getUsers(stub);8 assert.deepEqual(users, [1, 2, 3]);9 });10 it('should call callback', () => {11 const stub = sinon.stub().returns([1, 2, 3]);12 getUsers(stub);13 assert(stub.calledOnce);14 });15});
Using AI Code Generation
1const sinon = require('sinon');2const assert = require('assert');3const { EventEmitter } = require('events');4const { once } = require('events');5const emitter = new EventEmitter();6const stub = sinon.stub().resolves(42);7emitter.on('foo', stub);8emitter.emit('foo', 'bar');9assert(stub.calledOnceWith('bar'));10const sinon = require('sinon');11const assert = require('assert');12const { EventEmitter } = require('events');13const { once } = require('events');14const emitter = new EventEmitter();15const stub = sinon.stub().resolves(42);16emitter.on('foo', stub);17emitter.emit('foo', 'bar');18assert(stub.calledOnceWith('bar'));19stub.restore();
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!