如何使用 PHPUnit 在类中测试单个 void 方法?
Posted
技术标签:
【中文标题】如何使用 PHPUnit 在类中测试单个 void 方法?【英文标题】:How can I test a single void method inside a class with PHPUnit? 【发布时间】:2022-01-24 00:39:30 【问题描述】:我一直在寻找这个问题的答案,但似乎找不到任何具体的答案。
假设我有一个具有多个方法的类,并且在该类中我有一个仅从 javascript 请求调用的方法。该方法内部还有一些其他方法调用。但是,它没有返回值,也没有参数。我想针对该方法测试一些案例。这是一个例子:
public function myMethod(): void
$dataArray = request()->data;
$service = $this->doMath();
$start = $service->getStart($paramA, $paramB);
// Couple computations here to get $someData
$end = $someData;
$this->final['start'] = $start;
$this->final['end'] = $end;
所以本质上,我想为myMethod()
编写一些测试,并为$paramA
和$paramB
赋予不同的值,并断言$this->final
具有正确/错误的输出。
如何解决这个问题?
【问题讨论】:
你不能只实例化类、运行方法和测试属性值吗?另见laravel.com/docs/8.x/http-tests @miken32 我正在考虑这样做。所以我要实例化的是,在数组中有一些数据并测试这些值。不过,这将如何与 phpUnit 一起工作(在文档中找不到任何内容)?或者我想一个更好的问题是,这实际上是一种正确的测试方式吗?我在一个代码库上入职,并且实际上并没有针对此类的任何单元测试,并且该方法只是在那里做一件事。很困惑,因为它是一段非常关键的代码,需要进行适当的测试。 只需使用标准断言来测试您想要的任何内容。该链接包含有关如何填充请求对象的详细信息,或者您可以使该方法接受可选参数,如果未提供它们则回退到请求。无论如何,在控制器上下文之外依赖请求对象并不是一个好习惯,因此将数据作为参数包含在内将使测试更容易并改进代码。 【参考方案1】:听起来您想在 Service->getStart($paramA, $paramB) 上运行 Laravel 单元测试,并使用您想要输出的任何参数集。不过,您不应该在测试用例中进行计算——只需准备参数、调用函数并检查函数返回值。对于不同的参数,您制作一个新的测试用例。这是一个例子:https://learn2torials.com/a/laravel8-unit-test-part-2
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于如何使用 PHPUnit 在类中测试单个 void 方法?的主要内容,如果未能解决你的问题,请参考以下文章
Phpunit 在测试类中仅模拟一种方法 - 使用 Mockery