Glimmer 中的组件单元测试

component unit testing in Glimmer

对于经典的组件单元测试,我们如何将其迁移到 Glimmer?此组件单元测试正在测试未向用户公开的本地 prop。

const component = this.owner
  .factoryFor('component:some-component')
  .create({
    someModel: { foo: 'bar' }
  });

assert.equal(component.get('someLocalProp'), false);

这些确实是anti-pattern!实际上,单元测试组件通常是 anti-pattern:您实际上并不是 testing the interface 那样的组件。这就是我的意思:与组件的所有交互,无论是作为另一个开发人员调用它还是作为用户与之交互,都是通过模板发生的。像这样对其进行“单元”测试并不代表 最终用户或调用它的其他开发人员将如何与之交互。

大多数时候,存在这样的测试是因为开发人员想要检查内部方法或 getter 的行为。然而,这正是我们在测试时应该做的相反。我们 想测试 public 契约:这就是允许我们实际进行重构工作的原因:也就是说,改变内部实现 without 更改 public 合同。依赖内部行为的测试必然 over-coupled 且脆弱。在 UI 组件的情况下,这意味着像这样的“单元”测试实际上是 always over-coupled 和脆弱的。

例如,如果 getter 在模板中不直接可见,谁会关心它是否计算给定值?我们真的只关心计算的结果

Glimmer 组件没有 directly-corresponding API,部分原因是。这里正确的模式是将组件测试重写为集成测试, 允许您测试组件的实际接口(或者如果它不提供实际值则将其删除)。