有没有办法可以测试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();
}
答案 0 :(得分:3)
您未在发布的代码中测试任何内容。 $productRepository
和$category
为stubs,您拨打的电话会配置他们的行为。
例如,
$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 $category
和ProductRepository $productRepository
)并返回一个1 product
或X 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
如何获取其数据;所有你关心的是它返回一个数字,所描述的方法必须以特定的方式使用该数字。