angular - Angular 中的浅层测试 - 覆盖模板 - 这是一种好习惯吗?
问题描述
我有一个关于在 Angular 单元测试中覆盖模板的假设问题(如果这不是一个合适的问题,请建议关闭而不是标记它,我将删除/关闭问题)。我的团队成员喜欢在 Angular 中进行单元测试时覆盖 HTML 模板,所以如果我有一个测试,它看起来像这样:
describe('MyWhateverComponent', () => {
let component: MyWhateverComponent;
let fixture: ComponentFixture<MyWhateverComponent>;
// lots more things here removed
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
MyWhateverComponent
],
schemas: [...],
imports: [...],
providers: [...]
}).overrideTemplate(MyWhateverComponent, '<div>Overridden template</div>')
.compileComponents();
}));
我的同事似乎喜欢这样做的原因是他们说它只允许他们测试组件代码(包含在 .ts 文件中),它可以防止我们不得不模拟或包含指令并且我们不想测试 Angular 绑定像ngIf
, ngFor
,ngClass
等... 很好的论据,但对我来说似乎是错误的,因为我认为您应该测试视图中呈现的内容,因为它可以防止意外的行为或内容。这个论点似乎并没有安抚我的同事,还有其他人可以建议或想到为什么我们在 Angular 中对我们的组件进行单元测试时不应该覆盖模板的其他原因。对我来说,感觉就像我们测试的性质并没有真正处理我们真正的组件。我会假设(因为我没有做任何检查)浅层测试会更快地执行另一个支持我的同事的理由。
任何想法或意见都提前表示赞赏。
解决方案
在我看来,不应该覆盖被测试组件的完整模板。模拟子组件很好,但不是实际的组件。
几个原因 :
- 您可能
@ViewChild()
在您的组件中使用,在您的模板中引用一些 dom 元素或子组件。所以你肯定会失去这个。 - 我相信,组件测试更多的是测试视图模板(渲染),而不是
implementation
或behaviour
(方法)。 组件是面向用户的,它们需要用户的输入。所以你的测试应该更多地集中在从视图中获取输入和测试输出。(不是通过直接调用该方法并期望它已被调用)
前任 :
spyOn(comp, 'calculate'); comp.calculate(); expect(comp.calculate).toHaveBeenCalled();
推荐阅读
- c# - 只读结构与类
- logstash - Graylog:糟糕的 GELF UDP 性能
- vue.js - 将 Vue 指令设置为条件
- c# - 无法从“Microsoft.AspNetCore.Mvc.ActionResult”转换为“System.Collections.Generic.IEnumerable”
' - javascript - 在 Windows 平台上启用 Electron 应用通知的粘性行为
- angular - 如何使用 Angular 5 中的模型类为任何 api 服务制作 base64 图像和插入
- unity3d - unity 自定义触发事件
- swift - Swift如何防止图像旋转和淀粉
- laravel - 为什么我的 Laravel 队列命令在 Redis 队列驱动程序上随着时间的推移变慢?
- javascript - 使用特定元素从现有数组中创建新数组