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

时间:2016-02-02 18:06:46

标签: php testing tdd phpspec

有没有办法可以测试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();
}

1 个答案:

答案 0 :(得分:3)

您未在发布的代码中测试任何内容。 $productRepository$categorystubs,您拨打的电话会配置他们的行为。

例如,

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

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

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

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

  

问题是,PhpSpec不是为集成测试而设计的 - 实际上,它并非专为测试任何内容而设计。它被设计为一种工具,可以帮助您提供精心设计的课程。

函数it的名称中的

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

方法it_returns_something_if_products_exist()的名称应该建议它描述的功能。

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

规范可能如下所示:

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');
    }
}

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