Я довольно новичок в тестировании Phpspec и не знаю, как правильно тестировать несколько сценариев при преобразовании объекта в другую структуру ответа.
Мне нужно проверить, правильно ли рассчитана цена. Здесь у меня есть тест спецификации Transformer:
/**
* @dataProvider pricesProvider
*/
public function it_should_check_whether_the_prices_are_correct(
$priceWithoutVat,
$priceWithVat,
$vat,
Request $request,
Repository $repository
) {
$productIds = array(100001);
$result = array(
new Product(
'100001',
'MONSTER',
new Price(
$priceWithoutVat,
20,
'GBP',
null,
null
)
)
);
$expected = array(
array(
"productId" => "100001",
"brand" => "MONSTER",
"price" => array(
"amount" => $priceWithVat,
"vatAmount" => $vat,
"currencyCode" => "GBP",
"discountAmount" => (int)0
)
)
);
$repository->getResult(array(
Repository::FILTER_IDS => $productIds
))->willReturn($result);
$request->get('productIds')->willReturn(productIds);
/** @var SubjectSpec $transformedData */
$transformedData = $this->transform($request);
$transformedData->shouldEqual($expected);
}
public function pricesProvider()
{
return array(
array('123.456789', 14814, 2469),
array('60.00', 7200, 1200),
);
}
В моем классе Transformer у меня есть функция, которая форматирует данные в правильный формат:
public function transform(Request $request)
{
$productIds = $request->get('productIds');
$productsResult = $this->repository->getResult(array(
Repository::FILTER_IDS => $productIds
));
$products = array();
foreach ($productsResult as $product) {
$products[] = $this->formatData($product);
}
return $products;
}
/**
* @param Product $product
* @return array
*/
private function formatData(Product $product)
{
return array(
'productId' => $product->getId(),
'brand' => $product->getBrandName(),
'price' => array(
'amount' => (int)bcmul($product->getPrice()->getAmountWithTax(), '100'),
'vatAmount' => (int)bcmul($product->getPrice()->getTaxAmount(), '100'),
'currencyCode' => $product->getPrice()->getCurrencyCode(),
'discountAmount' => (int)bcmul($product->getPrice()->getDiscountAmount(), '100')
)
);
}
Проблема в том, что я получаю это сообщение об ошибке:
316 - it should check whether the prices are correct
warning: bcmul() expects parameter 1 to be string, object given in
/src/AppBundle/Database/Entity/Product/Price/Price.php line 49
Если я жестко закодирую эти значения, тогда тест зеленый. Однако я хочу протестировать цены и результаты различных вариантов, поэтому я решил использовать метод dataProvider
.
Но когда dataProvider
передает значение $amountWithoutTax
, это не строка, а класс PhpSpec\Wrapper\Collaborator
, и из-за этого bcmul
завершается неудачей.
Если я изменю значение $amountWithoutTax
на $priceWithoutVat->getWrappedObject()
, то класс Double\stdClass\P97
будет пройден, и из-за этого bcmul
завершится неудачей.
Как мне сделать эту работу? Это какая-то банальность или я совершенно не понял эту концепцию?
Я использую https://github.com/coduo/phpspec-data-provider-extension и в composer.json есть следующее:
"require-dev": {
"phpspec/phpspec": "2.5.8",
"coduo/phpspec-data-provider-extension": "^1.0"
}