【问题标题】:Angular best practice for using TestBed.CompileComponents().then()使用 TestBed.CompileComponents().then() 的 Angular 最佳实践
【发布时间】:2019-12-16 05:44:49
【问题描述】:

我设置了一个测试平台来验证我的模块是否已定义。

describe('MyModule', () => {
    beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [MyModule]
        }).compileComponents();
    }));

    it('should be defined', () => {
        expect(MyModule).toBeDefined();
    });
});

我的代码样式工具 SonarQube 要求我将 .then() 语句添加到 .compileComponents() 行,因为返回的承诺未使用。

最好保持原样并忽略样式工具,还是添加一个空语句,如.then(() => { /* empty */ })

我倾向于忽略该工具,但想知道哪种方式更适合已发布的 Angular 样式文档。

【问题讨论】:

  • 我在 WebStorm/TSLint 中收到这些警告。这不是技术问题,因为如果没有人调用 then(),promise 仍然会解决。该警告试图告诉开发人员他们没有处理产生的结果并且很可能是一个错误,但在这种情况下它不是一个错误。因此,您可以通过使用注释禁用它来忽略或抑制它。调用 .then() 只是为了抑制警告。
  • 那么您是否建议添加忽略语句?
  • 如果您使用的是 Sonar,并且您希望 Sonar 不报告该问题,请添加忽略或重新配置 Sonar。如果您要与不会使用 Sonar 的其他人共享源代码,请忽略它。添加.then() 可以很容易地被其他认为不应该存在的开发人员删除。这与辩论缩进的制表符与空格是一样的。自己做决定……
  • 在 JavaScript 中终止所有内容是一种很好的做法,因为当函数返回 Promise 而不是 void 或未按预期返回 Promise 时,您可能会遇到意外情况。 SQ 和 tslint 中的类似规则是有原因的,你应该遵守它们。
  • 不要忘记,如果您不喜欢空的then 并且不喜欢linting 错误beforeEach(async(() => { return TestBed.configureTestingModule({ // <--- Notice the return imports: [MyModule] }).compileComponents(); }));,您可以简单地return 整个方法链

标签: angular unit-testing promise jasmine


【解决方案1】:

首先你的代码看起来坏了,应该是:

beforeEach(async () => {
    TestBed.configureTestingModule({
        imports: [MyModule]
    }).compileComponents();
});

那不应该再触发 SQ 了。但是如果你不使用异步,那么你可以使用空.then(),这是正确的方法。

【讨论】:

  • 刚刚测试,它可以编译并且测试在你的版本和我的版本中都通过了。
  • 你是否在任何地方定义了一个名为async 的函数?
  • 啊,是的,我正在从“@angular/core/testing”导入异步,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多