2016-10-28 37 views
0

所以我遇到了另一個障礙,我正在與...我有一個方法是一個同步調用,並在此它調用promise,async,方法。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。 上面的測試是試圖讓'時間'通過。我已經嘗試過,沒有同樣的失敗。 我真的很關注如何測試這個想法。也許我的代碼在這個方法中引用了一個promise。

我可以說的唯一的事情是,我沒有任何關於configureRouter方法的選擇。任何指導表示讚賞。

謝謝! 凱利

+0

一般來說,主要問題是'configureRouter'應該是正確的異步,否則唯一能夠測試它的方法是用黑客。 – robertklep

回答

0

簡短的回答:

我最近發現我試圖讓configureRouter方法是同步調用(使其使用異步等待關鍵字)。我發現的是Aurelia確實允許這種方法得到承諾。正因爲如此,有關的測試不再是問題。

較長的答案:

這樣做的另一部分是,我有通天的問題babelling之間排隊的摩卡咖啡,然後babelling爲wallaby.js擺。由於某種原因,這兩人在一起打得不好。

在上面的測試中,另一件事是也更改以下:

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

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

我覺得有一個步驟,但在這個時候,我不記得。在任何一種情況下,知道我可以使用承諾使我的世界更容易爲Aurelia。