2

我想在 phpunit 中创建一个模拟来验证是否使用正确的参数调用了一个函数。该参数是一个关联数组,包含三个元素,两个已知,一个未知:

array( 'objecttype' => 'thing', 'objectid'=> 2, 'tstamp' => [some tstamp here] )

因为我不知道确切的完整数组,所以我不能使用 equalTo 约束。我可以使用logicalAnd、contains 和arrayHasKey 的组合来到达那里,但这看起来很老套,而且,如果出于某种疯狂的原因,我的键和值混淆了,它不会捕获错误。有没有更好的方法来处理这个?

4

1 回答 1

3

这是一个快速而简单的自定义约束,用于检查传递的数组是否至少包含给定的条目(键/值对)。将其添加到您的自定义测试框架或 PHPUnit 分支。请注意,它使用==相等性以便'5'匹配的键/映射5

class ArrayHasEntries extends PHPUnit_Framework_Constraint
{
    /**
     * @var array
     */
    protected $array;

    /**
     * @param array $array
     */
    public function __construct(array $array)
    {
        $this->array = $array;
    }

    /**
     * Evaluates the constraint for parameter $other. Returns TRUE if the
     * constraint is met, FALSE otherwise.
     *
     * @param mixed $other Value or object to evaluate.
     * @return bool
     */
    protected function matches($other)
    {
        foreach ($this->array as $key => $value) {
            if (!array_key_exists($key, $other) || $other[$key] != $value) {
                return false;
            }
        }
        return true;
    }

    /**
     * Returns a string representation of the constraint.
     *
     * @return string
     */
    public function toString()
    {
        return 'has the entries ' . PHPUnit_Util_Type::export($this->array);
    }

    /**
     * Returns the description of the failure
     *
     * The beginning of failure messages is "Failed asserting that" in most
     * cases. This method should return the second part of that sentence.
     *
     * @param  mixed $other Evaluated value or object.
     * @return string
     */
    protected function failureDescription($other)
    {
        return 'an array ' . $this->toString();
    }
}
于 2012-08-10T22:44:50.903 回答