【发布时间】:2013-06-29 23:11:03
【问题描述】:
我在 Laravel 4 中使用 creating 模型事件构建模型端验证:
class User extends Eloquent {
public function isValid()
{
return Validator::make($this->toArray(), array('name' => 'required'))->passes();
}
public static function boot()
{
parent::boot();
static::creating(function($user)
{
echo "Hello";
if (!$user->isValid()) return false;
});
}
}
它运行良好,但我遇到了 PHPUnit 问题。以下两个测试完全相同,但只是第一个通过:
class UserTest extends TestCase {
public function testSaveUserWithoutName()
{
$count = User::all()->count();
$user = new User;
$saving = $user->save();
assertFalse($saving); // pass
assertEquals($count, User::all()->count()); // pass
}
public function testSaveUserWithoutNameBis()
{
$count = User::all()->count();
$user = new User;
$saving = $user->save();
assertFalse($saving); // fail
assertEquals($count, User::all()->count()); // fail, the user is created
}
}
如果我尝试在同一个测试中创建一个用户两次,它会起作用,但就像绑定事件仅出现在我的测试类的第一个测试中一样。在第一次测试执行期间,echo "Hello"; 仅打印一次。
我简化了我的问题的案例,但您可以看到问题:我无法在不同的单元测试中测试多个验证规则。从几个小时开始,我几乎尝试了所有事情,但我现在快要跳出窗户了!有什么想法吗?
【问题讨论】:
-
谢谢。最后,模型事件不容易测试。我用这个技巧解决了我的问题:我在我的
setUp()方法中调用User::boot()。 -
我更喜欢使用
User::observe(new UserObserver),这样你就可以自己测试UserObserver了。 -
@AlexandreButynski 我也做了同样的事情,最后它是针对这个问题的简洁且包罗万象的解决方案,但似乎没有适当的修复。希望这是可行的,这要归功于 Eloquent 模型上的
__callStatic方法(Model::boot是protected),它为我们省去了在模型上定义公共方法以使其可测试的麻烦。感谢您的提示!