PHPUnit :: Mocking :: $ this-> Once () проходит.$ this-> at (0) не работает - PullRequest
0 голосов
/ 06 декабря 2011

Мой тест не пройден, когда я использую $ 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 Ответ

1 голос
/ 06 декабря 2011

Я могу только догадываться, поскольку не могу заглянуть в setWs, но единственное отличие состоит в том, что ->at(0) всегда пытается сопоставить функцию FIRST, вызывающую объект mock, и, возможно, конструктор WS уже что-то вызывает ( как пример).

Поскольку я не могу сказать ничего более конкретного без исполняемого тестового примера, может быть, что-то общее:

С текущими возможностями PHPUnit Mocking API нет необходимости каждый раз использовать ->at(0). Все, что я видел, использует ->at(), теперь можно выразить более красиво, используя ->will($this->logicalOr(...) вместе с ->returnCallback() или ->returnValueMap(). См. Этот пример для at и returnCallback

Так что, если у вас нет сценария использования, когда вам НУЖНО (!) Убедиться, что вызовы методов находятся в правильном порядке, я бы не беспокоился об этом:)


Basic -> на примере, который работает, на всякий случай

<?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);
    }   
}
...