【问题标题】:Testing abstract class with static properties测试具有静态属性的抽象类
【发布时间】:2014-05-05 18:28:00
【问题描述】:

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

【问题讨论】:

  • 不要测试抽象,测试具体
  • 这不会与我所有其他扩展 Validator 的 Validation 类产生大量重复吗?
  • 因为你不能实例化一个抽象,你不能在抽象中测试方法而不创建一个具体的类来测试它们......也许有一个简单的具体类来扩展你的抽象纯粹用于测试如果您不想重复测试,这些方法
  • 我会使用 Laravel 的 IoC/Facades 功能来完全避免静态的东西。

标签: php testing laravel phpspec


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2015-08-13
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2013-01-15
    相关资源
    最近更新 更多