繁体   English   中英

使用静态属性测试抽象类

[英]Testing abstract class with static properties

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM