【发布时间】:2019-02-14 00:40:25
【问题描述】:
我正在尝试为这个 Angular 脚本编写单元测试:
export class DataService {
private csrfToken: string = '';
private isContentShow: BehaviorSubject<boolean> = new BehaviorSubject(true);
constructor(private http: HttpClient, private cookieService: CookieService) {
this.token = this.cookieService.get('token');
}
public createData(data: Data) {
try {
this.http.post( url,
data,
{
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': this.token
})
})
.subscribe(
data => {
this.isContentShow.next(true);
},
err => {
this.showError();
},
() => console.log('Request Complete')
);
return true;
} catch {
this.showError();
}
}
public getIsContentShow(): Observable<boolean> {
return this.isContentShow.asObservable();
}
}
到目前为止我进行的测试以及它按预期运行。
it('#getIsContentShow should return value from observable',
(done: DoneFn) => {
service.getIsContentShow().subscribe(value => {
expect(value).toBe(true);
done();
});
});
但是我正在尝试为createData() 函数编写测试
我可以使用HttpClientTestingModule 模拟HttpClient,但是我不知道如何处理CookieService 和令牌?
谢谢
【问题讨论】:
-
您需要在创建用于测试的服务之前设置您的模拟,因为您在构造函数中调用了 cookieService.get()。然后,当服务创建时,它将命中模拟并返回您设置的值以设置
token。 -
@dmcgrandle 你认为我应该将讲师内部的 this.token 移动到 createData() 函数吗?不确定哪种方式更好。谢谢
-
我不知道您的应用程序的要求,所以我无法回答哪种方式“更好”。它可能使测试更直接。如果您愿意接受代码重写建议,那么我建议在服务中进行订阅不是最佳实践 - 尝试将其推送到组件或更好地推送到模板。
标签: javascript angular unit-testing angular7