1

私はテストが初めてで、phpspecを使用して、入力を検証するサービスクラスをテストしています。static::$base_rulesと を使用しているため、クラスをテストする方法がわかりませんstatic::$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\Validatorphpspec を使用してどのようにテストできますか?

4

1 に答える 1

3

静的の使用は無視します...

他の人がすでに示唆しているように、具体的な実装を指定する必要があります。仕様の目的のためだけに1つを提供できます(たとえば、他の人が使用する抽象クラスのみを提供する場合)。

抽象クラスの代わりに具体的な実装を使用するように phpspec に指示する必要があります。

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