Согласно нашему разговору в комментариях, одна из проблем, с которыми вы сталкиваетесь в своей функции и, как следствие, вызывает проблему в вашем тесте, - это зависимость, при которой результат не может быть гарантирован каждый раз. То есть ваш звонок в другую службу в вашей функции add
не гарантирован , чтобы обеспечить определенный c вывод.
Думайте о своем тесте так.
- Я начинаю с заказа с нулевым товаром и нулевой промежуточной суммой
- Я хочу добавить товар к этому заказу
- Я хочу завершить заказ с одним товаром, и подытог в десять долларов
В этом тесте вас не волнует как создается элемент заказа, вам просто нужно, чтобы он создавался с заданное значение c, чтобы при его добавлении к вашему заказу конечный результат соответствовал ожидаемому.
В этом случае вы хотите, чтобы $this->order_item
был поддельным объектом, и тогда вы можете смоделировать вызов createOrderItem
, чтобы вернуть известный объект заказа. Немного сложно показать вам законченное решение, поскольку оно может включать некоторые архитектурные изменения, но ваш тест будет выглядеть примерно так:
public function it_adds_an_item_to_an_order()
{
$orderItem = Mock(OrderItem::class); // Use whatever mocking lib is available
$orderitem->shouldReceive('createOrderItem').andReturn(new OrderItem([$subtotal=>10.00]));
$orderService = new OrderService($orderItem);
$order = $orderService->add($data);
$this->assertNotNull($order);
$this->assertEquals(10.00, $order->subtotal);
}
Надеюсь, это поможет вам в будущем.