【问题标题】:PHPUnit is reporting errors instead of recognizing assertFalse()PHPUnit 报告错误而不是识别 assertFalse()
【发布时间】:2014-11-21 16:16:45
【问题描述】:

我正在尝试测试一个需要“密码”和“电子邮件”属性的简单 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”……帮助?

【问题讨论】:

  • User::save() 的代码是什么样的?如果需要电子邮件,您的代码不应该退出而不是尝试保存到数据库吗?

标签: unit-testing laravel-4 phpunit


【解决方案1】:

您的测试正在寻找返回 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;
    }
 }

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

【讨论】:

  • 我明白了。我认为所有这些功能都是 Eloquent 内置的。谢谢史蒂文和施莱斯。
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2011-01-08
  • 2014-09-10
  • 1970-01-01
相关资源
最近更新 更多