Как сбросить ожидания на фиктивном объекте PHPUnit

У меня есть большое количество тестов в TestCase. Я хочу установить фиктивный объект, который возвращает одно и то же значение в большинстве тестов, но в некоторых тестах я бы хотел настроить это значение.

Моя идея состояла в том, чтобы создать set_up() метод (я не смог установить ожидания внутри автоматически вызываемого setUp()) и вручную вызывать его в начале каждого теста. В этом методе я бы установил возвращаемое значение по умолчанию, затем в нескольких тестах, в которых необходимо настроить возвращаемое значение, я бы вызвал ожидаемый во второй раз и, надеюсь, перезаписал возвращаемое значение по умолчанию. Это не работает, возвращаемое значение не перезаписывается.

Вот упрощенный пример:

<?php

class SomeClass {
function someMethod() {
}
}

class SomeTest extends PHPUnit_Framework_TestCase {
private $mock;

function set_up() {
$this->mock = $this->getMockBuilder('SomeClass')
->disableOriginalConstructor() // This is necessary in actual program
->getMock();
$this->mock->expects($this->any())
->method('someMethod')
->will($this->returnValue(1));
}

function test() {
$this->set_up();

$this->mock->expects($this->any())
->method('someMethod')
->will($this->returnValue(2));

$this->assertEquals(2, $this->mock->someMethod());
}
}

Кажется, что это должно быть возможно от чтения Как сбросить ложный объект с помощью PHPUnit.

PHPUnit макет с несколькими вызовами Expected () не отвечает на мой вопрос.

Я использую phpUnit 4.2

3

Решение

Вы можете передать аргументы методу set_up, чтобы он мог настроить макет при необходимости:

function set_up($someMethodReturnValue = 1) {
$mock = $this->getMockBuilder('SomeClass')
->disableOriginalConstructor() // This is necessary in actual program
->getMock();
$mock->expects($this->any())
->method('someMethod')
->will($this->returnValue($someMethodReturnValue));
return $mock;
}function test() {
$mock = $this->set_up(2);
$this->assertEquals(2, $this->mock->someMethod());
}

Вы можете дополнительно улучшить метод set_up (). В конце концов, вы можете создать класс создания Mock, если есть много опций.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]