【发布时间】:2015-10-21 18:40:59
【问题描述】:
我正在为我的模型的 CRUD 操作使用生成的库(LoopBack 的 Angular SDK),并且发现很难对使用它们的控制器和服务进行单元测试。
这是一个我正在创建组织的示例,在完成该请求后,我为该组织创建了一个管理员(需要该组织的 ID,这就是我等待创建管理员的原因)。
$scope.createOrganization = function () {
var newOrg = {
name: $scope.organization.name,
description: $scope.organization.description,
location: $scope.organization.location
};
Organization.create(newOrg, createAdmin);
};
var createAdmin = function (organization) {
var newAdmin = {
name: $scope.organization.admin.name,
email: $scope.organization.admin.email,
password: $scope.organization.admin.password,
organizationId: organization.id
};
Admin.create(newAdmin, function () {
AuthService.login({ email: newAdmin.email, password: newAdmin.password }).then(function () {
$state.go('admin.dashboard');
});
});
};
Organization.create 和 Admin.create 是 LoopBack SDK 中的方法,我不想碰它们。它们不使用典型的 Angular 承诺语法 (Service.method().then()),而是将回调函数作为参数(或者,您可以选择使用 Organization.create(newOrg).$promise.then(createAdmin)。
我对此的测试看起来像:
it('should create an organization and admin when submitted', inject(function (Organization, Admin) {
scope.organization = mockOrg; // object with all fields filled in
spyOn(Organization, 'create');
spyOn(Admin, 'create');
scope.createOrganization();
expect(Organization.create).toHaveBeenCalledWith({
name: mockOrg.name,
description: mockOrg.description,
location: mockOrg.location
}, Function);
}));
最后我不知所措。不知道如何编写一个测试来测试是否使用正确的信息调用了两个创建函数(最重要的是,我需要测试在组织创建之后 调用了 Admin,并且它传递了一个organization.id 变量)。
【问题讨论】:
-
如果你想使用承诺,你应该承诺你的回调函数,而不是通过
.then将承诺代码放在那些回调链中。您的主要问题是createOrganisation和createAdmin既不接受回调也不返回承诺,这使得它们确实无法使用(不仅无法测试)。
标签: javascript angularjs unit-testing jasmine loopbackjs