angular - 在进行 Angular 单元测试时如何使用 SpyOn 函数调用服务
问题描述
我有一个返回用户对象的服务。该服务使用从私有属性设置的公共属性。
private privateProperty: BehaviorSubject<User | Me | null> = new BehaviorSubject(
null
);
public publicProperty: Observable<
User | Me | null
> = this.privateProperty.asObservable();
服务请求是通过我的组件内的私有方法调用的,我很难在我的单元测试中覆盖它。我不确定如何设置我的测试以命中该私有方法,从而调用该服务并将一些值设置为已定义。
这是我的测试。
it('should set user oninit', ()=> {
let me: Me | User;
spyOn(userService, 'publicProperty').and.returnValue(of(userMock));
component.ngOnInit();
expect(userService.publicProperty).toHaveBeenCalled();
expect(component.me).toBeDefined();
});
但是在运行测试时,我得到了这个失败的结果:
期望(间谍).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
61 | component.ngOnInit();
62 |
> 63 | expect(userService.publicProperty).toHaveBeenCalled();
| ^
64 | expect(component.me).toBeDefined();
65 |
66 | });
我不确定我做错了什么,有没有人让这个工作?
解决方案
如果您只需要确保组件中的私有方法正在为服务中的 publicProperty 分配值,则可以将普通的期望与服务 publicProperty 一起使用
it('should set user oninit', ()=> {
let me: Me | User;
component.ngOnInit();
expect(userService.publicProperty).toEqual(valueExpected);
expect(component.me).toBeDefined();
});
推荐阅读
- lua - 使用纯 Lua 脚本对齐的文本自动换行
- c++ - 将 lambda 一般存储在 constexpr 结构中
- java - Java Timer Countdown 从某个时间开始
- flask - 如何使用 GET/POST 将 GET 发送到烧瓶
- computation-theory - 计算以下代码的代码复杂度
- llvm - clang-tidy 未能通过错误检查
- mysql - Mysql 查询匹配以检查查询是否已更新
- oracle - 如何使用 pl/sql 从用户输入的日期中提取月份
- php - 如何在laravel的db中存储带有问题及其具体答案的数组
- c# - IEnumerable.Count() 方法花费太多时间