【发布时间】:2014-05-05 18:28:00
【问题描述】:
我是测试新手,我正在使用 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'
);
}
如何使用 phpspec 测试 Acme\Services\Validation\Validator?
【问题讨论】:
-
不要测试抽象,测试具体
-
这不会与我所有其他扩展 Validator 的 Validation 类产生大量重复吗?
-
因为你不能实例化一个抽象,你不能在抽象中测试方法而不创建一个具体的类来测试它们......也许有一个简单的具体类来扩展你的抽象纯粹用于测试如果您不想重复测试,这些方法
-
我会使用 Laravel 的 IoC/Facades 功能来完全避免静态的东西。
标签: php testing laravel phpspec