javascript - Jasmine spyOn 报告函数在没有被调用时被调用
问题描述
我有以下代码:
$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,则显示成功祝酒并刷新,否则显示危险祝酒。
我希望测试失败,因为它返回 500 的状态,但它通过了。这意味着ngToast.success()
并且scope.refreshApps()
已被调用。
我在代码中添加了一些日志,它确实返回status: 500
并转到该else
块。
我在这里想念什么?
解决方案
该问题与deleteJob
. 您的it
测试甚至在expect
执行之前就结束了。因此,您需要某种同步。这基本上可以用fakeAsync
和tick
from来完成@angular/core/testing
。
it('should show success toast on delete and refresh apps', fakeAsync(() => {
...
sandboxService.deleteJob();
tick();
expect(ngToast.success).toHaveBeenCalled();
expect(scope.refreshApps).toHaveBeenCalled();
}));
然而问题是你deleteJob
用下面的间谍覆盖了原来的行为,因此ngToast.success
不会scope.refreshApps
被调用,测试也会失败。
spyOn(sandboxService, 'deleteJob').and.returnValue(Promise.resolve({status: 500}));
推荐阅读
- python - 对字典中的项目进行二进制搜索
- php - 为什么这个托管服务提供商的 time() 不同步?php
- octave - Octave 运行但图表未显示
- ios - PHP 和 MySQL 专家在 swift 中感觉就像一个假人
- terraform - 在 terraform 模块中省略可选块
- php - 使用 Hook 删除 WooCommerce 营销菜单项 (wp-admin)
- django - 如何使用地理定位 API 向用户位置提供默认点字段值,无法将字符串转换为浮点数:
- python - 计算行满足条件的前 n 行
- excel - 根据日期过滤 Excel
- javascript - BehaviorSubject 在广播问题上刷新以保留价值