Php 使用静态属性测试抽象类
我是测试新手,我正在使用phpspec测试一个验证输入的服务类。我不确定如何测试该类,因为它使用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
静态::$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'
);
}