【发布时间】:2020-09-07 19:00:15
【问题描述】:
我正在制作一个简单的snackbar,代码如下,
app.component.ts:
ngOnInit(){
this.dataService.valueChanges.pipe(
filter((data) =>data=== true),
switchMap(() => {
const snackBarRef = this.matSnackBar.open(
'A new value updated',
'OK',
{
duration: 3000
}
);
return snackBarRef.onAction();
})
)
.subscribe(() => {
this.window.location.reload();
});
}
app.component.spec.ts(包括服务的模拟数据)
describe('AppComponent', () => {
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
let matSnackBarSpy: jasmine.SpyObj<MatSnackBar>;
let a = "";
let b = "";
let c = "";
const mockDataService = {
valueChanges: of(true)
};
beforeEach(async(() => {
TestBed.configureTestingModule({
a = "Test";
b = "X";
c = "suc";
matSnackBarSpy = TestBed.get<MatSnackBar>(MatSnackBar);
})
}))
describe('#ngOnInit()', () => {
it('should call MatSnackBar.open()', async(done: DoneFn) => {
const error = new HttpErrorResponse({ error: 'Some error' });
component.ngOnInit();
expect(mockDataService.valueChanges).toBeTruthy();
expect(matSnackBarSpy.open(a,b,c)).toBeTruthy();
done();
});
});
})
data.service.ts
import { Observable } from 'rxjs';
export class DataService {
valueChanges: Observable<boolean>;
}
说明:
我有一项服务,其属性为
valueChanges,类型为Observable<boolean>。在
component.ts中,我得到了如上所述的值变化,我收到的最终结果是布尔值true,并且小吃店也打开了,一切正常。-
现在我正在执行上述测试用例,例如
compoenent.spec.ts,expect(mockDataService.valueChanges).toBeTruthy(); expect(matSnackBarSpy.open(a,b,c)).toBeTruthy();
这会导致成功,但我永远会在 chrome 中收到以下输出。
- 但我已经尝试使用 ref 到 Mocking MatSnackBar in Angular 8 & Jasmine 进行此操作,但没有帮助。
要求:需要涵盖当前显示警告/指示上图中未涵盖的所有测试..
以上测试用例正在运行,但当我们打开组件的index.html 时,测试覆盖率仍显示未覆盖函数和未覆盖语句警告。
【问题讨论】:
-
我没有完全关注。问题,什么工具告诉你上面粉红色的内容不在测试范围内?此外,您不会想要涵盖 matSnackbar 的 open 方法,因为它不是您编写的。开发该库的人对此进行了测试。你想用你的测试来完成什么?如果它只是 100% 的代码覆盖率,我认为这不会像你想象的那样。您可能需要重新考虑如何进行测试。看看这些martinfowler.com/bliki/TestCoverage.htmlmartinfowler.com/testing
标签: angular typescript unit-testing jasmine karma-jasmine