1

我是测试新手,我正在使用 phpspec 测试一个验证输入的服务类。我不确定如何测试该类,因为它使用static::$base_rulesstatic::$create_rules. 这些值由扩展的子类确定Acme\Services\Validation\Validator

我意识到我用 phpspec 做的事情有点倒退,但我想用这个既定的课程练习,我不确定这是否可能,或者我的Acme\Services\Validation\Validator课程是否编码不当。

我想用 phpspec 测试的类

<?php namespace Acme\Services\Validation;

use Illuminate\Validation\Factory as Validation;

abstract class Validator
{

    /**
     * @var array
     */
    protected $rules;

    /**
     * @var object
     */
    protected $validation;

    /**
     * @var Validator
     */
    private $validator;

    /**
     * @param Validation $validator
     */
    public function __construct(Validation $validator)
    {
        $this->rules = isset(static::$base_rules) ? static::$base_rules : [];
        $this->validator = $validator;
    }

    /**
     * @param $input
     * @return \Illuminate\Validation\Validator
     */
    public function validateCreateRules($input)
    {
        $rules = array_merge(static::$create_rules, $this->rules);

        return $this->validate($input, $rules);
    }

    /**
     * @param $input
     * @param $rules
     * @return \Illuminate\Validation\Validator
     * @throws FormValidationException
     */
    public function validate($input, $rules)
    {
        $this->validation = $this->validator->make($input, $rules);

        if ($this->validation->fails())
        {
            throw new FormValidationException('Validation failed', $this->getValidationErrors());
        }
        return $this->validation;
    }

    /**
     * @return mixed
     */
    public function getValidationErrors()
    {
        return $this->validation->errors();
    }
}

这是一个扩展 Validator 的示例类

<?php namespace Acme\Services\Validation;

class MessageValidator extends Validator {

    static $base_rules = array(
        'type'              => 'required',
        'title'             => 'required',
        'message'           => 'required'
    );

    static $create_rules = array(
        'user'              => 'required'
    );

}

如何Acme\Services\Validation\Validator使用 phpspec 进行测试?

4

1 回答 1

3

我将忽略静态的使用...

正如其他人已经建议的那样,您应该指定具体的实现。您可以仅出于规范的目的提供一个(例如,如果您只提供抽象类供其他人使用)。

您必须告诉 phpspec 使用具体实现而不是抽象类:

$this->beAnInstanceOf('My\Not\Abstract\Implementation');
于 2014-05-05T22:00:47.373 回答