Unit testing PHPUnit正在报告错误,而不是识别assertFalse()

Unit testing PHPUnit正在报告错误,而不是识别assertFalse(),unit-testing,laravel-4,phpunit,Unit Testing,Laravel 4,Phpunit,我试图测试一个简单的Laravel模型,它需要密码和电子邮件属性。我的测试结果如下 public function testEmailIsRequired() { $user = new User; $user->password = 'derp'; // should not save $this->assertFalse($user->save()); } 我不是正确地认为这不起作用,也不是一个成功的测试,而是 1) UserTest:

我试图测试一个简单的Laravel模型,它需要密码和电子邮件属性。我的测试结果如下

public function testEmailIsRequired() {
    $user = new User;
    $user->password = 'derp';

    // should not save
    $this->assertFalse($user->save());

}
我不是正确地认为这不起作用,也不是一个成功的测试,而是

1) UserTest::testEmailIsRequired 
Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 
19 NOT NULL constraint failed: users.email 
(SQL: insert into "users" ("password", "updated_at", "created_at") 
values (derp, 2014-09-26 15:27:07, 2014-09-26 15:27:07))
[...]
FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

恐怕我在这里完全是个新手。在我看来,PHPUnit应该抑制数据库驱动程序自己的错误报告,而只是接受false…help?

您的测试正在寻找返回false的函数。函数中生成的任何其他错误仍将返回,因为您正在调用该函数

public function testEmailIsRequired() 
{
    $user = new User;
    $user->password = 'derp';

    // should not save
    $this->assertFalse($user->save());

}

public function testMockSaveWorks()
{
    $Mock = $this->getMock('User', array('save'));

    // Set up the expectation for the getResult() method 
    $Mock->expects($this->any())
         ->method('save')
         ->will($this->returnValue(true));

    $this->assertTrue($Mock->save());
}

class User()
{
...
    public function save()
    {
        if( is_null($this->email) )
            return false;

        ...
        return true;
    }
 }

然后,您应该使用mock删除实际的save函数及其与数据库的连接,并让mock返回true来假装保存记录,以表明您已经测试了模块。

User::save的代码是什么样子的?如果需要电子邮件,你的代码不应该退出而不是试图保存到数据库吗?我明白了。我认为所有这些功能都是为了雄辩而内置的。谢谢Steven&Schleis。