2016-10-28 6 views
0

Так что я столкнулся с другой проблемой, с которой я сражаюсь ... У меня есть метод, который является вызовом синхронизации, и в этом метод, который он называет обещанием, асинхронным методом.TDD: Sinon 2.x и пытается протестировать метод синхронизации, который использует 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; 
    } 
} 

Тест я попробовал следующий в мокко

... 

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. Любые рекомендации приветствуются.

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

+0

Вообще говоря, главная проблема заключается в том, что 'configureRouter' должен быть надлежащим асинхронным, иначе единственный способ проверить его - с помощью хаков. – robertklep

ответ

0

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

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

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

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

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

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

в

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^