如何测试取决于参数的开关盒?

Posted

技术标签:

【中文标题】如何测试取决于参数的开关盒?【英文标题】:How can I test a switch case that depends on a parameter? 【发布时间】:2019-06-22 00:51:35 【问题描述】:

我有这个:

  const renderComponents = () => 
    switch (selectedService) 
      case 'otherservices':
        return <SoftLayerCancellationRequests />;
      case 'dedicatedhosts':
        return <GetDedicatedHostsCancellations />;
      case 'virtualguestsservers':
        return <SoftLayerGetVirtualGuests />;
      case 'baremetalservers':
        return <GetBareMetalServersCancellations />;
      default:
        return null;
    
  ;

最后在组件的return 语句中调用:

return (
    <>
      <Header pageTitle=t('cancellations.header') />

            accountId ? (
              <>
                <TableToolbarComp />
                renderComponents()
              </>
            ) : (
              <UpgradeMessage />
            )

    </>
  );

selectedService 参数来自商店:

export default compose(
  connect(store => (
    accountId: store.global.softlayerAccountId,
    selectedService: store.cancellations.selectedService,
  )),
  translate(),
  hot(module),
)(Cancellations);

我可以做些什么来测试那个开关盒?

【问题讨论】:

【参考方案1】:

renderComponents下的函数应该接受selectedService作为参数:

const renderComponents = (selectedService) => 
  switch (selectedService) 
    // ...
  
;

通过不依赖闭包,函数变得纯粹并且更容易进行单元测试:

it('renders a SoftLayerCancellationRequests when passed "otherservices" as parameter', () => 
  const wrapper = shallow(renderComponents('otherservices'));
  expect(wrapper.find(SoftLayerCancellationRequests)).toHaveLength(1);
)

然而,我认为此类测试没有什么价值。这是因为该函数基本上充当了一个简单的地图:

const serviceToComponent : 
  otherservices: SoftLayerCancellationRequests,
  dedicatedhosts: GetDedicatedHostsCancellations,
  virtualguestsservers: SoftLayerGetVirtualGuests,
  baremetalservers: GetBareMetalServersCancellations

测试起来似乎有点枯燥。

更有意义的测试是测试使用这种映射的组件的行为。

【讨论】:

老实说,我没有得到你上面写的测试。您声明const renderComponents 的第一部分是测试的一部分,还是您将其作为组件的一部分提及?因为我不知道如何调用它然后const wrapper = shallow(renderComponents('otherservices'));。最后一部分,那是什么? 好的,所以你自己的声明renderComponents 存在于渲染函数中?如果是这样,我建议将其提取并单独导出,以便您可以在测试中访问它(同样,如果您认为单独测试该功能是相关的)。可以吗,还是我应该澄清更多? 回答你的第二个问题,如果“最后一部分”是指toHaveLength(1) 函数调用,它是Jest API 的一部分,用于对数组进行断言。

以上是关于如何测试取决于参数的开关盒?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Pentaho 开关盒在运行后不会损坏?

开关盒上的 iOS 单元测试

带有内部开关盒的单元测试 API 调用

四.单元测试与黑盒测试

2 DC电参数测试

如何从 TeamCity 构建配置中设置 PowerShell 开关参数