TDD:Sinon 2.x 并尝试测试使用异步的同步方法
TDD: Sinon 2.x and trying to test a sync method that uses async
所以我 运行 遇到了另一个问题,我正在与之抗争......我有一个同步调用的方法,在这个方法中它调用了一个 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) 等于真。
上面的测试是试图让 'time' 通过。我试过没有,同样失败了。
我真的很想知道如何测试这个。也许我的代码错误地引用了这个方法中的承诺。
我唯一可以说的是,我对 configureRouter 方法别无选择。任何指导表示赞赏。
谢谢!
凯莉
简答:
我最近发现我正在尝试使 configureRouter 方法成为同步调用(使其使用 async await 关键字)。我发现 Aurelia 确实允许承诺使用该方法。因此,有问题的测试不再是问题。
更长的答案:
另一部分是我遇到了一系列的 babel 问题,介于 mocha 的 babelling 和 wallaby.js 的 babelling 之间。出于某种原因,这两个人在一起玩得不好。
在上面的测试中,另一件事是还要更改以下内容:
it('should update router config', function () {
到
it('should update router config', async function () {
感觉好像又多了一步,但此时想不起来了。无论哪种情况,知道我可以使用承诺让 Aurelia 的世界变得更加轻松。
所以我 运行 遇到了另一个问题,我正在与之抗争......我有一个同步调用的方法,在这个方法中它调用了一个 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) 等于真。 上面的测试是试图让 'time' 通过。我试过没有,同样失败了。 我真的很想知道如何测试这个。也许我的代码错误地引用了这个方法中的承诺。
我唯一可以说的是,我对 configureRouter 方法别无选择。任何指导表示赞赏。
谢谢! 凯莉
简答:
我最近发现我正在尝试使 configureRouter 方法成为同步调用(使其使用 async await 关键字)。我发现 Aurelia 确实允许承诺使用该方法。因此,有问题的测试不再是问题。
更长的答案:
另一部分是我遇到了一系列的 babel 问题,介于 mocha 的 babelling 和 wallaby.js 的 babelling 之间。出于某种原因,这两个人在一起玩得不好。
在上面的测试中,另一件事是还要更改以下内容:
it('should update router config', function () {
到
it('should update router config', async function () {
感觉好像又多了一步,但此时想不起来了。无论哪种情况,知道我可以使用承诺让 Aurelia 的世界变得更加轻松。