我在这里使用的是Angular 测试文档,具体来说,我想测试HTTP服务(模拟/监视HTTP调用并返回一个伪值)。
下面是代码:
describe('DataService', () => {
let service: DataService;
let httpClientSpy: jasmine.SpyObj<HttpClient>
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [DataService]
});
httpClientSpy = jasmine.createSpyObj('HttpClient', ['sendRequest$'])
// service = TestBed.inject(DataService);
service = new DataService(httpClientSpy);
});
it('should return expected results', () => {
let obj = JSON.stringify(data);
console.log(obj);
let newOjb = <SpecificObject>JSON.parse(obj);
console.log(newOjb);
httpClientSpy.post.and.returnValue(of(newOjb));
service.sendRequest$.subscribe({
next: data => {
expect(data)
.withContext('expected data')
.toEqual(newOjb);
}
});
expect(httpClientSpy.post.calls.count())
.withContext('one call')
.toBe(1);
});
服务. ts文件:
sendRequest$ = this.requestSubjectAction$.pipe(
switchMap(someRequest => this.http.post<SpecificObject>(this.PCFUrl, someRequest)),
tap(data => console.log(data))
);
但是,我不断得到错误:TypeError: Cannot read properties of undefined (reading 'and')
在我的控制台和当Karma打开Chrome运行测试。
失败的行具体为:httpClientSpy.post.and.returnValue(of(newOjb));
这只是那行代码的"and"部分失败了。这是直接从Angular得到的,所以我不知道该怎么做。
我试着把httpClientSpy.post.and.returnValue(of(newOjb));
改成get,我试着改变其他的东西,但是它总是在and上失败,我不知道为什么。有更好的方法来测试这个吗?
- 注意**:我使用的是***声明性***rxjs http调用,这就是方法调用后面有
$
的原因,因为它是一个变量。
- 注意**:我使用的是***声明性***rxjs http调用,这就是方法调用后面有
任何帮助都是感激的!
1条答案
按热度按时间nhn9ugyo1#
再次查看文档。
由于尚未定义
post
的模拟,因此将出现未定义的情况您已经将您的服务与模拟http合并。
改为:
根据以下评论进行更新:
您的服务调用是异步的。您应该在同一个位置运行所有Assert。
想想流程:
1.调用服务.sendRequest$。
1.您的测试会立即继续检查是否调用了http方法。
1.但在大多数情况下,它不会,因为这是一个典型的种族条件。
1.由于您的代码是在jasmine测试本身认为它已经“完成”之后才真正完成的,因此您必须传入done函数以便手动触发。https://jasmine.github.io/tutorials/async