【问题标题】:phpunit anything matcher inside arrayphpunit 数组内的任何匹配器
【发布时间】:2016-09-05 06:01:52
【问题描述】:

我有一个函数,它在处理完记录后返回一个记录数组。预期的返回值看起来像这样 -

[
  [....]
  ['Name', 'Quantity', 'Tags', 'Price', 'Total', 'Autogenerated Value']
  [....]
  [....]
]

Autogenerate Value 字段可以是动态生成的任何内容。

目前我正在尝试使用assertEquals 方法,但每次自动生成的值都会有所不同。我可以在这里使用类似anything() 的匹配器吗?

我真的不想编写自己的断言函数迭代预期值并使用assertArraySubset 断言

【问题讨论】:

    标签: php symfony testing phpunit matcher


    【解决方案1】:

    这还不可能,但您可以扩展 PHPUnit 以评估数组中的约束:

    • 像这样编写一个自定义的Comparator 实现

      class ConstraintComparator extends SebastianBergmann\Comparator
      {
          public function accepts($expected, $actual)
          {
              return $expected instanceof \PHPUnit_Framework_Constraint;
          }
          public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
          {
              $expected->evaluate($actual);
          }
      
    • 在引导文件中添加比较器:

      SebastianBergmann\Comparator\Factory::getInstance()->register(new ConstraintComparator);
      

    现在 PHPUnit 应该评估约束,而不是在它们出现的任何地方进行比较。

    【讨论】:

      【解决方案2】:

      我真的不想编写自己的断言函数迭代预期值并使用 assertArraySubset 断言

      但为什么不呢?

      如果您不希望日志中有大量断言,则可以将断言方法限制为抛出 PHPUnit_Framework_ExpectationFailedException 以防出现任何问题(即,如果数组的常量部分不存在或最后一个动态生成元素不是预期值)与确切的问题元素的内容。

      【讨论】:

        猜你喜欢
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 2021-09-24
        • 1970-01-01
        • 2020-07-17
        • 1970-01-01
        相关资源
        最近更新 更多