2016-10-28 4 views
0

私はこれと戦っている別の問題にぶつかりました...私は同期呼び出しであり、メソッドは、promise、async、methodを呼び出します。私のアプリで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; 
    } 
} 

私がどんなに私ながら、私は、configMockStubは常にfalseを得るために何を得る、モカ

... 

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

以内に次のことを試したんきたテストmenuService.getById.calledWith(1).to.equal(true)をtrueに設定しています。 上記のテストは、「時間」を過ぎて試してみる試みでした。私はそれを試したことがなく、同じように失敗しました。 私は実際にこれをテストする方法に関するアイデアを驚かせています。たぶん私は、このメソッド内の約束を参照するコードを間違っている。

唯一のことは、configureRouterメソッドを選択する必要がないということです。どんな指導も高く評価されます。

ありがとうございます! ケリー

+0

一般的に言えば、主な問題は、 'configureRouter'も適切なasyncでなければならないということです。そうでなければ、テストできる唯一の方法はハッキングです。 – robertklep

答えて

0

短い答えは:

私は最近、私は(それが非同期に使用するキーワードを待つ作る)configureRouterメソッドは同期呼び出し可能にするためにしようとしていた発見しました。私が知ったことは、アウレリアがその方法を約束することができるということでした。このため、問題のテストはもはや問題にはなりません。

長い答え:

本の他の部分は、私はバベルの問題は、モカのためbabelling間並んし、その後wallaby.jsためbabellingのスルーを持っていたということです。何らかの理由で、これらの2つはうまく一緒に遊んでいなかった。上記の試験では、他のものは、以下を変更することでした

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

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

別のステップがあったような気がしますが、この時点で私が思い出すことができません。いずれの場合でも、私は約束を使用できることを知って、私の世界をAureliaにとってはるかに容易にしました。

関連する問題