Модульное тестирование window.location.assign с использованием Karma / Mocha / Sinon / Chai - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь выполнить модульное тестирование функции, используя Karma в качестве моего тестового прогона, Mocha в качестве моей тестовой среды, Sinon в качестве моей библиотеки для проверки / отслеживания / шпионажа и Chai в качестве моей библиотеки утверждений. Я использую Chromium в качестве моего автономного браузера в конфигурации Karma.

Однако я совершенно сбит с толку, почему я получаю следующую ошибку:

TypeError: Cannot redefine property: assign

... когда я запускаю npm test на этом:

function routeToNewPlace() {  
  const newLoc = "/accountcenter/content/ac.html";
  window.location.assign(newLoc);
}
describe('tests', function() {
  before('blah', function() {
    beforeEach('test1', function() {
          window.onbeforeunload = () => '';
      });
    });
  it('routeToNewPlace should route to new place', function() {
    expectedPathname = "/accountcenter/content/ac.html";
    routeToNewPlace();
    const stub = sinon.stub(window.location, 'assign'); 
    assert.equal(true, stub.withArgs(expectedUrl).calledOnce);
    stub.restore();
  });
});

Как видите, я пытаюсь назначить пустую строку для window.location, но, похоже, это не помогает.

Вот мой karma.config.js:

module.exports = function(config) {
    config.set({
      frameworks: ['mocha', 'chai', 'sinon'],
      files: ['jstests/**/*.js'],
      reporters: ['progress'],
      port: 9876,  // karma web server port
      colors: true,
      logLevel: config.LOG_INFO,
      //browsers: ['Chrome', 'ChromeHeadless', 'MyHeadlessChrome'],
      browsers: ['ChromeHeadless'],
      customLaunchers: {
        MyHeadlessChrome: {
          base: 'ChromeHeadless',
          flags: ['--disable-translate', '--disable-extensions', '--remote-debugging-port=9223']
        }
      },
      autoWatch: false,
      // singleRun: false, // Karma captures browsers, runs the tests and exits
      concurrency: Infinity
    })
  }

Любые мысли будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Попробуйте это:

Object.defineProperty(window, 'location', {
    writable: true,
    value: {
        assign: () => {}
    }
});
sinon.spy(window.location, 'assign');
0 голосов
/ 03 сентября 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что window.location.assign - это встроенная функция, которая недоступна для записи и не настраивается. См. Обсуждение дескрипторов свойств в MDN .

.

См. Этот скриншот, и он может помочь вам понять:

Showing property descriptor of window.location.assing

Это означает, что sinon не может шпионить за функцией assign, поскольку он не может перезаписать свой дескриптор свойства.

Самое простое решение - обернуть все вызовы window.location.assign в один из ваших собственных методов, например так:

function assignLocation(url) {
  window.location.assign(url);
}

А потом в своих тестах вы можете сделать:

const stub = sinon.stub(window, 'assignLocation');
...