Javascript Sinon异步测试:在推送发生之前未填充数组
我在Sinon&Chai为AngularJS应用程序编写测试。我做了Javascript Sinon异步测试:在推送发生之前未填充数组,javascript,arrays,angularjs,asynchronous,sinon,Javascript,Arrays,Angularjs,Asynchronous,Sinon,我在Sinon&Chai为AngularJS应用程序编写测试。我做了$httpbackend请求,并且我有一个假的用户数组-backendUsersResponse。它在my.spec.js中可用,但当我调用函数openSettings时它还没有填充,因此我的用户在我的控制器中是一个空数组 在哪里我可以告诉我的代码等待数组被填充?如何测试像这样的异步javascript内容 提前谢谢 控制器代码: export default class UserAccountsController {
$httpbackend
请求,并且我有一个假的用户数组-backendUsersResponse
。它在my.spec.js中可用,但当我调用函数openSettings
时它还没有填充,因此我的用户在我的控制器中是一个空数组
在哪里我可以告诉我的代码等待数组被填充?如何测试像这样的异步javascript内容
提前谢谢
控制器代码:
export default class UserAccountsController {
constructor(UserModel, userSettingsDialog) {
this.UserModel = UserModel;
this.userSettingsDialog = userSettingsDialog;
this.users = [];
UserModel.query()
.then((users) => {
this.users = users;
});
}
openSettings(user) {
const userToUpdate = user || new this.UserModel();
this.userSettingsDialog.openDialog(userToUpdate)
.then((data) => {
const cmd = data.value;
if (cmd === 'saveSettings') {
const isNew = angular.isUndefined(userToUpdate.id);
userToUpdate.$save();
if (isNew) {
this.users.push(userToUpdate);
}
}
});
}
}
UserAccountsController.$inject = [ 'UserModel', 'userSettingsDialog'];
试验
从'chai'导入{expect};
从“sinon/pkg/sinon”进口sinon;
描述('userAccounts Controller',()=>{
"严格使用",;
beforeach(angular.mock.module('myproject'));
让$httpBackend=null;
设$q=null;
让UserModel=null;
让userSettingsDialog=null;
beforeach(注入(函数($httpBackend,u UserModel,$q){
$httpBackend=\$httpBackend\;
UserModel=\u UserModel;
$q=$q;
}));
描述('openSettings',()=>{
让$controller;
让后端用户响应;
每次之前(注入(函数($controller_u41;){
用户设置对话框={
openDialog:sinon.stub(),
};
$controller=$controller;
后端用户响应={
用户:[
{
id:1,
姓名:'约翰',
角色:'管理员',
},
{
id:2,
名字:“迭戈”,
角色:'编辑',
},
],
};
}));
它('应该检查新用户是否被推送到数组',()=>{
//安排
常量ctrl=$controller('UserAccountsController'{
userSettingsDialog:userSettingsDialog,
});
const user=新用户模型({
名称:'着陆器',
});
常数数据={
值:“保存设置”,
};
$httpBackend.expectGET('api/users').Response(200,backendUsersResponse);
userSettingsDialog.openDialog.withArgs(user).returns($q.resolve(data));
$httpBackend.expectPOST('api/用户')。响应(200,用户);
//表演
ctrl.openSettings(用户);
$httpBackend.flush();
//断言
expect(usersetingsdialog.openDialog).to.have.been.called;
expect(user.name).to.equal('Lander');
expect(ctrl.users).not.to.be.empty;
expect(ctrl.users.length).to.be(3)//
import { expect } from 'chai';
import sinon from 'sinon/pkg/sinon';
describe('userAccounts Controller', () => {
'use strict';
beforeEach(angular.mock.module('myproject'));
let $httpBackend = null;
let $q = null;
let UserModel = null;
let userSettingsDialog = null;
beforeEach(inject(function(_$httpBackend_, _UserModel_, _$q_) {
$httpBackend = _$httpBackend_;
UserModel = _UserModel_;
$q = _$q_;
}));
describe('openSettings', () => {
let $controller;
let backendUsersResponse;
beforeEach(inject(function(_$controller_) {
userSettingsDialog = {
openDialog: sinon.stub(),
};
$controller = _$controller_;
backendUsersResponse = {
users: [
{
id: 1,
name: 'John',
role: 'admin',
},
{
id: 2,
name: 'Diego',
role: 'editor',
},
],
};
}));
it('should check if new user is pushed to an array', () => {
// arrange
const ctrl = $controller('UserAccountsController', {
userSettingsDialog: userSettingsDialog,
});
const user = new UserModel({
name: 'Lander',
});
const data = {
value: 'saveSettings',
};
$httpBackend.expectGET('api/users').respond(200, backendUsersResponse);
userSettingsDialog.openDialog.withArgs(user).returns($q.resolve(data));
$httpBackend.expectPOST('api/users').respond(200, user);
// act
ctrl.openSettings(user);
$httpBackend.flush();
// assert
expect(userSettingsDialog.openDialog).to.have.been.called;
expect(user.name).to.equal('Lander');
expect(ctrl.users).not.to.be.empty;
expect(ctrl.users.length).to.be(3); //<-- this one fails, array length is always 2, user is not added
});
});
});