【问题标题】:how to avoid the dependencies hell with unit test in angular 2+如何在 Angular 2+ 中通过单元测试避免依赖地狱
【发布时间】:2017-10-06 08:31:57
【问题描述】:

我看到了很多关于如何在 Angular 2+ 中对简单组件进行单元测试的示例,但是当涉及到使用服务的测试组件时,维护测试台提供程序和导入成为一场噩梦。 我该如何避免呢?

例如,我有 myComponents,谁使用 myService,谁使用 HttpClient。 要测试 myComponent,我必须为 myService 和 HttpClient 设置提供程序。 如果我在 myService 的构造函数中添加其他服务,我将不得不编辑使用此服务的 cmoponent 的所有测试平台。

我不能告诉测试平台获取这些模块的默认依赖项吗?

【问题讨论】:

    标签: angular unit-testing testing


    【解决方案1】:

    问题源于错误的测试方法。单元测试是关于测试单个单元。

    在这种情况下

    myComponents,谁使用myService,谁使用HttpClient。要测试 myComponent,我必须为 myService 和 HttpClient 设置提供程序。

    它测试的是myComponent 单元。这意味着任何其他单元都应该被模拟或存根,包括myService

    此时

    获取这些模块的默认依赖项

    被认为不是单元,而是集成/e2e 测试。

    【讨论】:

    • 似乎合法。但是,有没有办法为此自动设置存根?像 angular cli 这样的工具,可以在测试中进行模拟。
    • 我不这么认为。而且您不想将其信任给机器。相反,您最初需要跳过存根并使测试失败,因此您可以清楚地看到当前单元依赖于哪些其他单元。 myService stub 本身可以是简单的 jasmine.createSpyObj 单线。
    • 我完全不同意你的观点,对我来说,使用模拟所有依赖项测试组件是一种反模式 (fabiopereira.me/blog/2010/05/27/…)。为了解决您的问题@TyKayn,您应该拥有具有组件所需的所有依赖关系的模块,并使用该模块设置您的测试(而不是内联所有依赖关系)。为了使您的测试更容易,您可以使用github.com/Pragmatists/ng-test-runner - 您必须只传递模块来测试您的组件 - 而不会暴露您的组件的真正依赖关系。
    • @wprzechodzen 你的结论是什么?它被一些互联网人标记为反模式的事实仅意味着它被标记了。黑盒测试是集成测试(或功能测试,取决于观点)。不是单位。它们服务于不同的目的。这就是答案所说的。失败的黑盒测试可能很难诊断。 “重言式”单元测试是明确的,这就是它的目的。当应用程序被单元测试和 e2e 测试完全覆盖时,一般来说黑盒测试就没有空间了,它们是多余的。黑盒则相反。
    • @EstusFlask,你写这篇文章已经过去了一段时间,你的观点可能已经改变,但我想指出最佳实践的变化。基于类的单元测试会导致“RGRR”反模式,或“红色、绿色、重构、重写测试,因为您更改了对象契约”。最初,单元测试中的“单元”是一个“隔离单元”,而不是一个类/方法——一个没有副作用的测试用例,它模拟了实际的用户需求。它们写起来更麻烦——就像在瓶子里造一艘船——但它们有助于重构,因为内部结构没有暴露出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2016-10-31
    • 1970-01-01
    • 2020-11-21
    • 2016-10-01
    • 1970-01-01
    相关资源
    最近更新 更多