gpt4 book ai didi

PhpSpec - 检查方法返回一个整数而不是 "willReturn(x)"

转载 作者:行者123 更新时间:2023-11-28 21:04:36 27 4
gpt4 key购买 nike

有没有一种方法可以测试 getNumberOfProductsForCategory 方法将返回一个整数而不是一个特定值(在本例中为 18)?

我觉得简单地测试“18”虽然现在是正确的,但会使我的测试变得非常脆弱,因为该值可能会在将来的某个时候发生变化,这意味着测试将失败。

这是我的 PhpSpec 函数(为简洁起见进行了缩减):

    function it_returns_something_if_products_exist(
ProductRepository $productRepository,
Category $category
)
{
$category->getId()->willReturn(268);
$productRepository->getNumberOfProductsForCategory($category)->willReturn(18);

// call method here
}

这是我的存储库方法:

/**
* @param Category $category
*
* @return mixed
*/
public function getNumberOfProductsForCategory(Category $category)
{
$dql = 'SELECT COUNT(tvp)
FROM \CRMPicco\ProductBundle\Entity\Product tvp
WHERE tvp.category = :category';

return $this->getEntityManager()
->createQuery($dql)
->setParameter('category', $category)
->getSingleScalarResult();
}

最佳答案

您没有在发布的代码中测试任何内容。 $productRepository$categorystubs以及您所做的调用会配置它们的行为。

例如,

$category->getId()->willReturn(268);

配置对象$category(模仿Category类型对象的行为)在其方法时返回268调用 getId()

如果没有这个配置,$category->getId() 返回 NULL

事实上,phpspec不是测试工具,它是规范工具。它不用于测试代码的行为,而是用于描述其行为。看看 phpspec 的创建者对 limitations of phpspec 的评价.特别检查限制 #8:

The thing is, PhpSpec was not designed for integration tests – in fact, it wasn’t designed for testing anything really. It was designed as a tool to help you come up with well-designed classes.

it 从函数的名称 it_returns_blah_blah_blah() 指的是您描述的类,该类是提供规范名称的类。例如,如果您发布的函数是类 FormatterSpec 的成员,则意味着它描述了类 Formatter 的行为。

it_returns_something_if_products_exist() 方法的名称应该表明它所描述的功能。

假设您要描述方法 Formatter::formatNumberOfProducts()。它有两个参数(Category $categoryProductRepository $productRepository)并返回一个字符串,它是 1 productX products(将 X 替换为类别中的实际产品数量)。

规范可能如下所示:

class FormatterSpec
{
function it_formats_number_of_products_when_they_are_many(
ProductRepository $productRepository,
Category $category
)
{
// prepare the stubs
$category->getId()->willReturn(268);
$productRepository->getNumberOfProductsForCategory($category)
->willReturn(18);

// describe the behaviour
$this->formatNumberOfProducts($category, $productRepository)
->shouldReturnString();
$this->formatNumberOfProducts($category, $productRepository)
->shouldBe('18 products');
}


function it_formats_number_of_products_when_there_is_only_one(
ProductRepository $productRepository,
Category $category
)
{
// prepare the stubs
$category->getId()->willReturn(268);
$productRepository->getNumberOfProductsForCategory($category)
->willReturn(1);

// describe the behaviour
$this->formatNumberOfProducts($category, $productRepository)
->shouldReturnString();
$this->formatNumberOfProducts($category, $productRepository)
->shouldBe('1 product');
}
}

您需要配置 stub ,因为您知道方法 formatNumberOfProducts() 调用了它们的一些方法。您使用 stub 是因为您不关心 $productRepository 如何获取其数据;您所关心的只是它返回一个数字,并且所描述的方法必须以特定方式使用该数字。

关于PhpSpec - 检查方法返回一个整数而不是 "willReturn(x)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35160741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com