TDD:Sinon 2.x并尝试测试使用异步

时间:2016-10-28 01:11:11

标签: unit-testing mocha sinon aurelia-navigation wallaby.js

所以我遇到了另一个障碍,我正在与之斗争...我有一个同步调用的方法,在这个方法中它调用了一个promise,async,方法。

在我的应用中,我有以下内容:

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;
  }
}

测试我在mocha中尝试了以下内容

...

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 个答案:

答案 0 :(得分:0)

简短回答:

我最近发现我试图使configureRouter方法成为同步调用(使其使用异步等待关键字)。我发现Aurelia确实允许这种方法得到承诺。因此,相关测试不再是问题。

更长的答案:

另一部分是我有一大堆babel问题排在妈妈之间,然后为wallaby.js喂奶。出于某种原因,这两个人在一起打得不好。

在上面的测试中,另一件事是改变以下内容:

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

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

我觉得还有另一步,但此时我不记得了。在任何一种情况下,知道我可以使用承诺使我的世界更容易Aurelia。