测试消耗其他组件的组件时,关注点分离是什么?

dandan

在为使用其他Web组件(子级)的Web组件(父级)编写测试时,父级的测试是否应提供覆盖范围以确保子级正确渲染/配置?

下面是一个例子,它可能是一个坏榜样,但也让我们尝试:说我们有一个组件(WebComponent的/反应,和/ Vue公司/灰烬,任何组件将在这里做的):<Carousel @options=options>这使得各个子组件:如<Video @options=options><Image @option=options>和其他许多人。

Carousel组件options从模型中接收一组,例如iconColorobjectFit,并以数据降级的方式传递该模型以与子组件共享并由其使用。

我应该测试在我的两个测试对于“用户可以配置iconColor通过对图像”<Image><Carousel>

对我来说似乎很尴尬,而且iconcolor对于在<Carousel>的各自测试中是否成功配置,并不是很干燥<Image>如果该<Carousel>组件使用5个不同的组件,则其测试开始按比例缩放,尤其是当我们添加更多配置选项时。

但是,同时没有两者都包含测试覆盖范围似乎非常脆弱。例如,如果我们依靠<Image>的测试覆盖范围来配置iconColor,则<Image>可以随时进行重构,而开发人员可以更改用于设置iconColor的属性的名称,请调整测试以使其匹配。开发人员不会意识到<Carousel>依赖于<Image>用于配置iconColor的API。

史蒂文伯格

如果您希望最大程度地覆盖代码,或者将父组件和子组件集成在一起是至关重要的(即,如果它没有以正确的方式将某些东西交给子组件,那么事情可能会进行得很顺利)错误),那么您绝对应该测试父组件和子组件之间的多种可能配置。

我理解您说的不是很干(在某些形式或情况下确实不是很干)的意思,但是您应该这样考虑:

在那里你隔离子组件和测试各种配置的情况下,是你的测试应主要关注测试什么这些组件与配置做的,当涉及到DOM或与任何服务测试的界限,等等。

以您的示例为例,如果我有一个<Image>组件,当我给它特定的道具或选项时,我将编写集成测试以断言其行为。例如,如果我传入这些参数会怎样?

<Image @width=100 @height=100 @onClick={{action "doSomething"}} />

集成测试应该测试这些值对其渲染的内容以及用户与图像的交互方式是否有影响。也许width以百分比height设置<img>标签的宽度和高度,然后单击图像应调用提供给该组件的操作。

另一方面,如果我已经有一个集成测试可以测试该组件可以执行的所有操作,那么为什么我们需要测试<Carousel /><Image />组件是否可以渲染该组件<Image />

答案是测试这两个组件之间的集成,并确保父组件与子组件正确连接。换句话说,就是要确保正确地<Carousel />将所有选项传递给其子组件

在某些情况下,这可能没什么大不了的,实际上,我认为很多时候这里的测试都可以忽略,但是就像我之前说的那样,如果集成很关键,则必须测试父级如何传递选项给孩子们。

为了说明这是如何提供覆盖的,请说我将<Carousel />组件的模板连接起来,如下所示:

轮播

<Image @width=50 @height=50 @onChange={{action "doSomething"}} />

看到这一点,您可以清楚地看到发生了什么-我的意思是将该动作链接为@onClick,而不是@onChange但是我所有的集成测试<Image />都通过了,因此如果不测试<Carousel />组件如何将属性传递给子级,我将缺乏覆盖范围,并且此错误更有可能将其投入生产。

使其不进行DRY的部分是针对父级进行集成测试,并且必须编写非常相似的代码(即,确保单击图像时它调用正确的动作)。有时,这样做并没有真正好的方法-而且我认为在这种情况下,集成可能会被忽略。在其他时候,可以采取一些措施来减少重复的测试代码。

在Ember中,有时传入属性会与子组件的特定类名绑定(除了其他功能)。我们可以编写一个集成测试来检查“子组件是否收到正确的属性?”,而不是复制一个检查“子组件的行为是否正确?”的测试。

例如,如果我们的父组件是这样连接的:

轮播

<Image @someFlag=true />

假设此@someFlag属性执行以下操作:

  • 向图像添加一个类
  • 使图像在鼠标悬停时尺寸增大
  • 发出网络请求,以在单击图像时报告一些用户指标

<Image />如果@someFlag为真,则组件的集成测试将测试所有这些内容但是,除了重复该精确测试之外,我们<Carousel />组件的集成测试可以简单地检查:“<Image />组件是否具有预期的类名?” 这实际上是减少您需要编写的重复测试代码数量的一种非常常见的方法。

当然,在某些情况下,您不需要测试集成。如果<Carousel />只是将它收到的任何东西传递给子代,那么您就有理由反对为这种事情编写集成测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章