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

phpunit: Comparing object param of with() for Mock object

提问人:RayJ_inSJ 提问时间:4/7/2013 最后编辑:RayJ_inSJ 更新时间:4/7/2013 访问量:1481

问:

我正在尝试将一个对象作为“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.
对象 模拟 phpunit

评论


答:

1赞 Jose Armesto 4/7/2013 #1

可能,PHPUnit 正在使用标识运算符 (===) 来检查对象是否相等。正如手册中所说

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

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

评论

0赞 RayJ_inSJ 4/7/2013
我以为这也可能是问题所在,但后来我能够为不同的方法编写一个测试。“更新”有效。我找到了区别和根本原因。我正在将返回的值赋值到对象中。$actual->newId = $iDao->插入($actual);这一定是修改了比较值。
0赞 RayJ_inSJ 4/7/2013 #2

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

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

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

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

*请注意,在调用模拟后修改$actual仍然会中断测试。所以这是行不通的。

$actual->id = $newId;