使用静态属性测试抽象类

时间:2014-05-05 18:28:00

标签: php testing laravel phpspec

我是测试的新手,我正在使用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'
    );

}

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

1 个答案:

答案 0 :(得分:3)

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

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

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

$this->beAnInstanceOf('My\Not\Abstract\Implementation');