sti*_*nvn 5 javascript jasmine jestjs jasmine-marbles
我正在尝试将我的单元测试从 Jasmine 转换为 Jest。一些测试在转换为 Jest 后开始失败。有人能解释一下为什么他们在 Jest 上失败了吗?
我设法将问题隔离到下面的测试用例中。
Jasmine 运行成功:
import { JasmineMarble } from './jasmine-marble';
import { cold } from 'jasmine-marbles';
import { switchMap } from 'rxjs/operators';
import { EMPTY, Observable } from 'rxjs';
class Service {
foo(): Observable<any> {
return EMPTY;
}
bar(a): Observable<any> {
return EMPTY;
}
}
describe('JasmineMarble', () => {
it('should create an instance', () => {
const service = new Service();
spyOn(service, 'foo').and.returnValue(cold('a|', { a: 'A' }));
spyOn(service, 'bar').and.returnValue(cold('a-b-c|', { a: 'A', b: 'B', c: 'C'}));
const result$ = service.foo().pipe(switchMap(a => service.bar(a)));
expect(result$).toBeObservable(cold('a-b-c|', { a: 'A', b: 'B', c: 'C'}));
expect(service.bar).toHaveBeenCalledWith('A');
});
});
Run Code Online (Sandbox Code Playgroud)
使用 Jest 会失败,并显示以下错误跟踪:
expect(jest.fn()).toHaveBeenCalledWith(expected)
Expected mock function to have been called with:
["A"]
But it was not called.
Run Code Online (Sandbox Code Playgroud)
笑话代码:
import { JestMarble } from './jest-marble';
import { cold } from 'jest-marbles';
import { switchMap } from 'rxjs/operators';
import { EMPTY, Observable } from 'rxjs';
class Service {
foo(): Observable<any> {
return EMPTY;
}
bar(a): Observable<any> {
return EMPTY;
}
}
describe('JestMarble', () => {
it('should create an instance', () => {
const service = new Service();
jest.spyOn(service, 'foo').mockReturnValue(cold('a|', { a: 'A' }));
jest.spyOn(service, 'bar').mockReturnValue(cold('a-b-c|', { a: 'A', b: 'B', c: 'C'}));
const result$ = service.foo().pipe(switchMap(a => service.bar(a)));
expect(result$).toBeObservable(cold('a-b-c|', { a: 'A', b: 'B', c: 'C'}));
expect(service.bar).toHaveBeenCalledWith('A');
});
});
Run Code Online (Sandbox Code Playgroud)
有人可以解释这种行为吗?
您可以在此处找到示例存储库:https://github.com/stijnvn/marbles
Jasmine 示例可以使用ng test jasmine-marbles. 笑话一与ng test jest-marbles.
现在有toSatisfyOnFlush介绍来处理这个问题:
describe('JestMarble', () => {
it('should create an instance', () => {
const service = new Service();
jest.spyOn(service, 'foo').mockReturnValue(cold('a|', { a: 'A' }));
jest.spyOn(service, 'bar').mockReturnValue(cold('a-b-c|', { a: 'A', b: 'B', c: 'C'}));
const result$ = service.foo().pipe(switchMap(a => service.bar(a)));
expect(result$).toBeObservable(cold('a-b-c|', { a: 'A', b: 'B', c: 'C'}));
expect(output$).toSatisfyOnFlush(() => {
expect(service.bar).toHaveBeenCalledWith('A');
});
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2089 次 |
| 最近记录: |