phpunit:比较Mock对象的with()的对象参数

时间:2013-04-07 07:09:17

标签: object mocking phpunit

我试图将一个对象作为“with”的参数与我的模拟对象进行比较。 当我比较预期和实际的var_dump时,它们看起来相当。 我的预感是我在->with参数中做错了。 在此先感谢

我的测试代码

public function testAddEntry()
{
    $expected = new Entry();
    var_dump($expected);
    $dbRef = $this->getMock('EntriesDAO');
    $dbRef->expects($this->once())->method('insert')
        ->with($expected);
    $actual = EntryHelper::addEntry($dbRef, $req);

要测试的功能代码

static function addEntry($iDao, $req)
{
$actual = new Entry();
var_dump($actual);
$actual->newId = $iDao->insert($actual);

来自控制台的输出

class Entry#212 (4) {
  public $id =>
  NULL
  public $content =>
  string(0) ""
  public $date =>
  string(0) ""
  public $userId =>
  NULL
}
class Entry#209 (4) {
  public $id =>
  NULL
  public $content =>
  string(0) ""
  public $date =>
  string(0) ""
  public $userId =>
  NULL
}

Time: 0 seconds, Memory: 2.75Mb

There was 1 failure:

1) EntryHelperTest::testAddEntry
Expectation failed for method name is equal to <string:insert> when invoked 1 time(s).
Parameter 0 for invocation EntriesDAO::insert(Entry Object (...)) does not match expected value.
Failed asserting that two objects are equal.

2 个答案:

答案 0 :(得分:1)

可能PHPUnit正在使用the identity operator (===)来检查对象是否相等。如手册中所述

  

...当使用身份运算符(===)时,对象变量是相同的,当且仅当它们引用同一个类的同一个实例时

由于您在方法addEntry()中创建了一个新的Entry实例,因此比较将失败。

答案 1 :(得分:0)

根本原因。我将返回的值分配给对象。 在我正在测试的功能中,

$actual->newId = $iDao->insert($actual); 

这一定是修改了比较值。 我通过将赋值分离到

来修复它
$newId = $iDao->insert($actual);

*注意,在调用mock之后修改$ actual会破坏测试。所以这不起作用。

$actual->id = $newId;