Laravel模型事件保存不会被解雇
我试图模拟Ardent
软件包在做什么。 保存前正在验证模型。
我已经创建了这个BaseModel
(根据Laravel Testing decoded
书)。 并添加了以下代码:
class BaseModel extends Eloquent {
protected static $rules = [];
public $errors = [];
public function validate(){
$v = Validator::make($this->attributes, static::$rules);
if($v->passes()) {
return true;
}
$this->errors = $v->messages();
return false;
}
public static function boot(){
parent::boot();
static::saving(function($model){
if($model->validate() === true){
foreach ($model->attributes as $key => $value) {
if(preg_match("/[a-zA-Z]+_confirmation/", $key)){
array_splice($model->attributes, array_search($key, array_keys($model->attributes)), 1);
}
}
echo "test"; //This is for debugging if this event is fired or not
return true;
} else {
return false;
}
});
}
}
现在,这是我的Post
模型:
class Post extends BaseModel {
public static $rules = array(
'body' => 'required',
'user_id' => 'required',
);
}
在这个测试中,我期待它失败。 相反,它通过! , $post->save()
返回true!
class PostTest extends TestCase {
public function testSavingPost(){
$post = new Post();
$this->assertFalse($post->save());
}
}
当我试图在saving
事件中抛出一个echo
语句saving
。 它没有出现,所以我明白我的定义的saving
事件不会被调用。 我不知道为什么。
看看这个讨论:https://github.com/laravel/framework/issues/1181
你可能需要在你的测试中重新注册你的事件。
class PostTest extends TestCase {
public function setUp()
{
parent::setUp();
// add this to remove all event listeners
Post::flushEventListeners();
// reboot the static to reattach listeners
Post::boot();
}
public function testSavingPost(){
$post = new Post();
$this->assertFalse($post->save());
}
}
或者,更好的是,您应该将启动函数中的事件注册功能提取到公共静态方法中:
class Post extends Model {
protected static boot()
{
parent::boot();
static::registerEventListeners();
}
protected static registerEventListeners()
{
static::saving(...);
static::creating(...);
...etc.
}
}
然后调用Post :: flushEventListeners(); 邮政:: registerEventListeners(); 在setUp()测试方法中。
保存事件对我来说看起来很好。 验证失败,所以$post->save()
返回false。 你的测试通过,因为你期望$post->save()
为false( assertFalse
),在这种情况下是正确的。 改为尝试这些测试。
public function testSavingInvalidPost() {
$post = new Post();
$this->assertFalse($post->save());
}
public function testSavingValidPost() {
$post = new Post();
$post->body = 'Content';
$post->user_id = 1;
$this->assertTrue($post->save());
}
链接地址: http://www.djcxy.com/p/83189.html