我有以下代码:
$scope.deleteJob = function(job) {
SandboxService.deleteJob(job.id).then(res => {
if (res.status == 200) {
ngToast.success();
$scope.refreshApps();
}
else {
ngToast.danger();
}
});
};
以及以下单元测试:
it('should show success toast on delete and refresh apps', () => {
spyOn(sandboxService, 'deleteJob').and.returnValue(Promise.resolve({status: 500}));
spyOn(ngToast, 'success');
spyOn(scope, 'refreshApps');
let mockJob = {
'id': 1
};
scope.deleteJob(mockJob);
sandboxService.deleteJob().then(() => {
expect(ngToast.success).toHaveBeenCalled();
expect(scope.refreshApps).toHaveBeenCalled();
});
});
基本上,删除作业时,如果删除成功且返回状态为 200,则显示成功 toast 并刷新,否则显示危险 toast。
我预计测试会失败,因为它返回状态 500,但它通过了。这意味着 ngToast.success()
和 scope.refreshApps()
已被调用。
我在代码中添加了一些日志,它确实返回 status: 500
并转到 else
block 。
我在这里缺少什么?
最佳答案
该问题与 deleteJob
的异步性质有关。您的 it
测试甚至在执行 expect
之前就结束了。因此,您需要某种同步。这基本上可以通过 @angular/core/testing
中的 fakeAsync
和 tick
来完成。
it('should show success toast on delete and refresh apps', fakeAsync(() => {
...
sandboxService.deleteJob();
tick();
expect(ngToast.success).toHaveBeenCalled();
expect(scope.refreshApps).toHaveBeenCalled();
}));
然而,问题是您正在使用下面的 spy 覆盖 deleteJob
的原始行为,因此 ngToast.success
和 scope.refreshApps
> 不会被调用并且测试将会失败。
spyOn(sandboxService, 'deleteJob').and.returnValue(Promise.resolve({status: 500}));
关于javascript - Jasmine spy 报告功能已被调用时,他们还没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708014/