如何使用 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

PHPUnit:如何在 Helper 文件中测试单个函数

Grails / Spock:如何在类中模拟从类本身调用方法的单个方法?

默认情况下在PHPUnit中运行单个测试套件

如何在类中有函数指针?

如何在类的成员函数上使用 numba?