#php #mocking #phpunit
Вопрос:
С помощью PHPUnit 6.5.14 я пытаюсь протестировать метод. Для этого нужно высмеять одну из его зависимостей; однако я не могу заставить ее работать. Вот урезанная версия:
class Order { public function create() { $CCP = new CreditCardProcessor(); $success = $CCP-gt;chargeCreditCard(); return $success; } } class CreditCardProcessor { public function chargeCreditCard() { return false; } }
class OrderTest extends TestCase { public function testCreate() { $mockCCP = $this-gt;getMockBuilder(CreditCardProcessor::class) -gt;setMethods(['chargeCreditCard']) -gt;getMock(); $mockCCP -gt;method('chargeCreditCard') -gt;willReturn(true); $O = new Order(); $success = $O-gt;create(); $this-gt;assertTrue($success, 'Was not able to create order.'); } }
Я прочитал документы и просмотрел несколько примеров, но не могу понять этого. Есть идеи, что я делаю не так? Спасибо.
Ответ №1:
Найдя больше примеров, я считаю, что решение состоит в том, чтобы передать зависимость в create
качестве аргумента:
class Order { public function create($CCP) { $success = $CCP-gt;chargeCreditCard(); return $success; } }
Тогда я смогу сделать то же самое в своем тесте:
class OrderTest extends TestCase { public function testCreate() { $mockCCP = $this-gt;getMockBuilder(CreditCardProcessor::class) -gt;setMethods(['chargeCreditCard']) -gt;getMock(); $mockCCP -gt;method('chargeCreditCard') -gt;willReturn(true); $O = new Order(); $success = $O-gt;create($mockCCP); $this-gt;assertTrue($success, 'Was not able to create order.'); } }
Я еще не пробовал, но этого должно хватить.
Мне не нравится идея изменения кода для удовлетворения тестов, но это, вероятно, также указывает на то, что мне нужно реструктурировать свой код.