【问题标题】:How to test if variables exists in functionLaravel如何使用phpunit测试函数中是否存在变量
【发布时间】:2021-12-08 21:10:45
【问题描述】:

我必须对这个功能进行单元测试

public function levels($id){
    switch($id){
        case 5: 
            $bread = 'N2';
        break;
        case 1: 
            $bread  = 'N1';       
        break;
    }  
} 

如何使用 phu 单元测试文件中的局部变量 $bread 进行 assertEqual 测试。我是测试文件 TestControllerTest 我不知道如何访问局部变量 $面包。我如何访问单元测试文件中的本地 $bread 。感谢 advacne.

【问题讨论】:

  • 如果你想像这样测试它,你的函数需要返回一些东西。但要更准确地回答,您也应该分享您的路由设置。 $bread 仅在您的函数上下文中可用 - 而不是在外部。如果你想断言你的 api 调用的响应,你必须返回 $bread 的值。
  • 这是我的返回码:return view('frontend.book')->with(compact('levels','bread'));

标签: php laravel phpunit


【解决方案1】:

单元测试应该测试一段代码的功能,而不是它的实现:它指定了一些输入条件,然后测试一些输出效果。然后,如果您更改函数的实现,单元测试可以告诉您是否不小心更改了功能

因此,即使您可以在测试中检查局部变量,这也是个坏主意,因为您将测试特定的实现,而不是功能。

您的示例函数没有任何意义,因为它实际上没有任何输出或效果:它设置一个局部变量,然后完成而不返回或将其存储在任何地方。

更现实的功能是这样的:

public function levels($id){
    switch($id){
        case 5: 
            $bread = 'N2';
        break;
        case 1: 
            $bread  = 'N1';       
        break;
    }
    return $bread;
} 

现在,您可以编写类似“如果我将 $id 传递为 5,我应该得到一个返回值 'N2'”的测试:

public function test_example() {
    $output = levels(5);
    $this->assertSame('N2', $output);
}

您甚至可以使用Data Provider 来编写输入-输出对的完整列表。

稍后,您可能会更改函数以使用 PHP 8 match statement,并且根本不用担心局部变量。单元测试会告诉您新代码是否仍具有与旧代码相同的功能,或者您是否引入了错误。

public function levels($id){
    return match($id){
        5 => 'N2',
        1 => 'N1',
    };
} 

如果问题在于现实生活中的函数真的很长,而您要测试的部分被埋在中间的某个地方,这是一个很好的迹象,您需要进行一些重构 : 将代码分解成更小的函数,然后测试每个部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2018-10-23
    • 2022-11-20
    • 2014-02-10
    相关资源
    最近更新 更多