Я, к сожалению, не уверен, что вы можете решить свой настоящий вопрос, используя getMock () , но мой опыт работы с getMock () сам по себе невелик.
Единственное, что я могу придумать, не зная вашего класса Bar , это может не помочь: третий параметр getMock () позволяет передавать аргументы конструктора (в виде массива).
Я бы создал свой собственный ложный класс, расширяющий Bar, в качестве помощника по тестированию (причудливое название «просто еще один класс, который, как оказалось, используется только в тестах»), который делает именно то, что мне нравится, и вводит сериюих в ваш Foo объект.Это дает вам все необходимое управление, поскольку вы можете напрямую заменить рассматриваемые методы, которые getMock () не делает.Конечно, это также означает, что вы не тестируете класс Bar в этом тесте, что может не соответствовать вашим ожиданиям - хотя я бы все равно рекомендовал написать отдельный тестовый класс для тестируемого класса, но бывают случаигде это излишне пурист.
$stubs = array();
foreach ($array as $value) {
$stubs[] = new MyBarTestHelper($value);
}
Кроме того, я искренне удивлен, что вы видите только описанное исключение, когда у вас есть более одного элемента массива.Я заметил, что PHPUnit на самом деле ожидает, что вы объявите любой метод, который вы хотите, чтобы он мог отслеживать, как параметр getMock () , и в противном случае выдает ошибку, поскольку, по сути, внутреннее созданиесобственное расширение класса, оборачивая каждый метод, который вы явно объявляете, логикой, которая позволяет ему определять, был ли он вызван (= добавление имени метода в логический список).
Так что раскрасьте меня наивно (серьезно, я, наверное,Я тестовый новичок, сам), но посмотрите, поможет ли это вам:
$stubs = array();
foreach ($array as $value) {
$barStub = $this->getMock('Bar', array('GetValue'));
$barStub->expects($this->any())
->method('GetValue')
->will($this->returnValue($value));
$stubs[] = $barStub;
}