PHPUnit :: Mocking :: $ this-> once()传递。 $ this-> at(0)失败

时间:2011-12-06 12:48:35

标签: php mocking phpunit

当我使用$ this-> at(0)而不是$ this-> once()时,我的测试失败了。我肯定在这里错过了一点,但我不知道是什么。谁知道那可能是什么?

/**
 * Passes
 */
public function testOne()
{
    $expected = array(
        'id' => 1,
        'name' => 'Product Name'
    );

    $mock = $this->getMock('WS');
    $mock->expects($this->once())
        ->method('getProductInfo')
        ->with($this->equalTo(1))
        ->will($this->returnValue($expected));

    $this->object->setWs($mock);

    // same as $mock->getInfo(1)
    $returned = $this->object->getWs()->getProductInfo(1);
    $this->assertEquals($expected, $returned);
}

/**
 * Fails
 */
public function testOne()
{
    $expected = array(
        'id' => 1,
        'name' => 'Product Name'
    );

    $mock = $this->getMock('WS');
    $mock->expects($this->at(0)) // all that changed
        ->method('getProductInfo')
        ->with($this->equalTo(1))
        ->will($this->returnValue($expected));

    $this->object->setWs($mock);

    // returned equals NULL
    // same as $mock->getInfo(1)
    $returned = $this->object->getWs()->getProductInfo(1);
    $this->assertEquals($expected, $returned);
}   

1 个答案:

答案 0 :(得分:1)

我只能猜测,因为我无法查看setWs,但唯一的区别是->at(0)总是尝试匹配FIRST函数调用模拟对象,也许WS的构造函数{1}}已经调用了某些内容(例如)。

在没有可执行测试用例的情况下,我不能说更具体的事情可能是一般性的:

使用PHPUnit Mocking API的当前功能,不需要每次使用->at(0)。我现在可以使用->at()以及->will($this->logicalOr(...)->returnCallback()更好地表达使用->returnValueMap()的所有内容。 See this example for at vs returnCallback

因此,如果您没有特定需要(!)的用例,以确保方法调用是正确的,我不会担心它:)


基本 - >示例有效,以防万一

<?php

class ClassToTest
{
    public function willGetCalled($value) {}
}

class TestClass extends PHPUnit_Framework_TestCase
{
    public function testWithExplicitMock()
    {   
        $mock = $this->getMock(
            'ClassToTest'
        );  

        $mock->expects($this->at(0))
            ->method('willGetCalled')
            ->with(5);

        $mock->willGetCalled(5);
    }   
}