Php 使用静态属性测试抽象类

Php 使用静态属性测试抽象类,php,testing,laravel,phpspec,Php,Testing,Laravel,Phpspec,我是测试新手,我正在使用phpspec测试一个验证输入的服务类。我不确定如何测试该类,因为它使用静态::$base\u rules和静态::$create\u rules。这些值由扩展Acme\Services\Validation\Validator的子类确定 我意识到我在phpspec上做的事情有点倒退,但我想用这个已建立的类进行练习,我不确定这是否可行,或者我的Acme\Services\Validation\Validator类是否编码不当 我想用phpspec测试的类 <?php

我是测试新手,我正在使用phpspec测试一个验证输入的服务类。我不确定如何测试该类,因为它使用
静态::$base\u rules
静态::$create\u 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();
    }
}

我将忽略静态的使用

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

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

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

不要测试摘要,测试具体化这不是会与扩展Validator的所有其他验证类产生大量重复吗?因为你不能实例化摘要,你不能在摘要中测试方法,而不创建具体类来测试它们。。。也许有一个简单的具体类可以扩展你的抽象,纯粹为了测试那些方法,如果你不想重复测试的话。我会使用Laravel的IoC/Facades功能来完全避免静态的东西。
<?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'
    );

}