【问题标题】:Should I use the function's constants when testing the function?测试函数时应该使用函数的常量吗?
【发布时间】:2020-04-17 13:43:51
【问题描述】:

如果我要测试的函数正在使用常量,我应该在测试时使用这些常量吗?

例如,如果这是函数:

export const SERVER_FILTERS = {
  URL: 'pageURL',
  PLATFORM: 'platform',
  TRAFFIC_SOURCE: 'trafficSource',
  COUNTRY: 'country',
  OPERATING_SYSTEM: 'operatingSystem',
  STATE: 'state',
};

export const formatUrlFilterForServer = filter => {
  return filter.conditions.map(({ value }) => {
    return {
      variable: SERVER_FILTERS.URL,
      value,
    };
  });
};

我应该在测试中使用SERVER_FILTERS 吗?还是明确写出我想在预期结果中看到的字符串更好?

例如:

describe('formatUrlFilterForServer', () => {
  it('should format the URL filter correctly', () => {
    const value = 'blah.com';
    const filter = {
      conditions: [
        { value },
      ],
    };
    const expectedResult = [
      {
        variable: SERVER_FILTERS.URL,
        value,
      },
    ];
    expect(formatUrlFilterForServer(filter)).toEqual(expectedResult)
  })
});

一方面,如果我更改此常量,我不想检查所有测试并修复它们。 另一方面,我认为我的测试应该发现我的代码可能存在的所有问题,甚至是其常量中的拼写错误。

这里有更好的做法吗?谢谢大家。

【问题讨论】:

  • 嗯,你在测试什么? 外部 API?该功能的消费者将如何使用该功能?内部验证?
  • 我正在进行单元测试,以确保该功能正常工作。在我的示例中 - 消费者将使用此函数在将某些值发送到服务器之前对其进行格式化。
  • 那么,消费者是否会使用常量和/或需要特定的返回值……?例如。如果函数需要返回一个特定的字符串是没有用的,但是您正在测试它返回一个实际上不包含该字符串的常量......
  • 你能再解释一下吗?不知道我明白你的意思。我所理解的是,这里没有我应该遵循的一般方法,如果我错了,请纠正我。
  • 当实际值无关紧要时,您可以使用常量而不是字符串,并且您只想确保在任何地方都使用 same 值。编程语言会在您输入常量时告诉您,而对于裸字符串,它不会告诉您相同的信息。那么,您是想测试您的函数是否返回正确的常量,还是因为实际值本身是有意义的,所以您关心返回的究竟是什么值?

标签: javascript unit-testing testing jestjs


【解决方案1】:
  • 您使用常量来避免拼写错误,或者如果值本身并不重要,您只需要确保在任何地方都使用相同的值。
  • 您正在测试代码以确保它以某种特定方式运行。

这是在这里使用的两个公理。所以问题是,你在测试什么?返回值本身重要还是不重要?您是否在测试您的函数是否返回预期的 value 或预期的无意义 flag

在单元测试中要问自己的另一件事是如果您更改某些内容可能会破坏以及您的测试是否会捕捉到这一点。如果您正在测试您的函数是否返回预期的 constant,那么如果您更改这些常量值是否会出现问题?你的函数现在可能返回一个不同的值,但测试——测试一个常数——没有改变。这是否需要?

因此,如果您的函数的职责是返回一个特定的字符串值(其确切的预期值可能由外力定义并且必须完全对应),那么您需要测试您的函数是否返回了该确切的字符串值。另一方面,如果您只是想确认您的函数正在采取正确的逻辑步骤并产生预期的逻辑状态,但其确切值并不重要,那么测试常量就可以了。

您当然也可以拆分差异:确认您的函数返回预期常量,并在单独的测试中确认这些常量包含预期值。您只需要确保您的测试能够捕捉到潜在的错误原因。

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 2010-11-23
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2016-11-29
    • 2018-04-10
    相关资源
    最近更新 更多