( function ( mw, $ ) { QUnit.module( 'mmv.logging.ViewLogger', QUnit.newMwEnvironment( { setup: function () { this.clock = this.sandbox.useFakeTimers(); // since jQuery 2/3, $.now will capture a reference to Date.now // before above fake timer gets a chance to override it, so I'll // override that new behavior in order to run these tests... // @see https://github.com/sinonjs/lolex/issues/76 this.oldNow = $.now; $.now = function () { return +( new Date() ); }; }, teardown: function () { $.now = this.oldNow; this.clock.restore(); } } ) ); QUnit.test( 'unview()', 4, function ( assert ) { var logger = { log: $.noop }, viewLogger = new mw.mmv.logging.ViewLogger( { recordVirtualViewBeaconURI: $.noop }, {}, logger ); this.sandbox.stub( logger, 'log' ); viewLogger.unview(); assert.ok( !logger.log.called, 'action logger not called' ); viewLogger.setLastViewLogged( false ); viewLogger.unview(); assert.ok( !logger.log.called, 'action logger not called' ); viewLogger.setLastViewLogged( true ); viewLogger.unview(); assert.ok( logger.log.calledOnce, 'action logger called' ); viewLogger.unview(); assert.ok( logger.log.calledOnce, 'action logger not called again' ); } ); QUnit.test( 'focus and blur', 1, function ( assert ) { var fakeWindow = $( '