TDD: Sinon 2.x и пытается проверить метод синхронизации, который использует асинхронный

Итак, я столкнулся с другим препятствием, с которым я борюсь... У меня есть метод, который является синхронизирующим вызовом, и в этом методе он вызывает метод обещания, асинхронный.

в моем приложении у меня есть следующее:

export class App {
   constructor(menuService) {
    _menuService = menuService;
    this.message = "init";
  }

  configureRouter(config, router) {
    console.log('calling configureRouter');

    _menuService.getById(1).then(menuItem => {
      console.log('within then');
      console.log(`configureRouter ${JSON.stringify(menuItem, null, 2)}`);

      const collection = menuItem.links.map(convertToRouteCollection);
      console.log(`collection ${JSON.stringify(collection, null, 2)}`);

      //I think there is an issue with asyn to synch for the test
      config.map(collection);
    }).catch(err => {
      console.error(err);
    });

    console.log('calling configureRouter assign router');
    this.router = router;
  }
}

Тест, который я пробовал в мокко

...

it('should update router config', function () {
      const expectedData = {
        name: "main menu",
        links: [{
          url: '/one/two',
          name: 'link name',
          title: 'link title'
        }]
      };
      const configMapStub = sinon.stub();
      const config = {
        map: configMapStub
      };

      const routerMock = sinon.stub();
      let app = null;
      const actualRouter = null;
      let menuService =  null;
      setTimeout(() => {
        menuService = {
          getById: sinon.stub().returns(Promise.resolve(expectedData).delay(1))
        };

        app = new App(menuService);
        app.configureRouter(config, routerMock);
      }, 10);

      clock.tick(30);

      expect(app.router).to.equal(routerMock);

      expect(menuService.getById.calledWith(1)).to.equal(true);

      //console.log(configMapStub.args);
      expect(configMapStub.called).to.equal(true);

      const linkItem = expectedData.links[0];
      const actual = [{
        route: ['', 'welcome'],
        name: linkItem.name,
        moduleId: linkItem.name,
        nav: true,
        title: linkItem.title
      }];
      console.log(`actual ${JSON.stringify(actual, null, 2)}`);
      expect(config.map.calledWith(actual)).to.equal(true);
    });
...

Независимо от того, что я получаю configMockStub всегда ложным, в то время как я получаю menuService.getById.calledWith(1).to.equal(true) равным true. Тест выше был попыткой попытаться получить "время" для прохождения. Я попробовал это без и одинаково потерпел неудачу. Я действительно поражаюсь идеями о том, как это проверить. Возможно, у меня неправильный код для ссылки на обещание внутри этого метода.

Единственное, что я могу сказать, у меня нет выбора по сравнению с методом configureRouter. Любое руководство приветствуется.

Спасибо! Келли

1 ответ

Решение

Короткий ответ:

Недавно я обнаружил, что пытаюсь сделать метод configureRouter синхронным вызовом (заставляя его использовать ключевые слова async await). Я обнаружил, что Аурелия позволяет обещать этот метод. Из-за этого рассматриваемый тест больше не является проблемой.

Более длинный ответ:

Другая часть этого состоит в том, что у меня было множество проблем с вейбл, выстраивающихся между бабеллингом для мокко, а затем бабеллингом для wallaby.js. По какой-то причине эти двое плохо играли вместе.

в приведенном выше тесте также нужно было изменить следующее:

it('should update router config', function () {

в

it('should update router config', async function () {

Я чувствую, что был еще один шаг, но сейчас я не могу вспомнить. В любом случае, знание того, что я могу использовать обещание, сделало мой мир намного проще для Аурелии.

Другие вопросы по тегам