【问题标题】:Lumen testing with PHPUnit showing too much assertions with only 2 tests使用 PHPUnit 进行流明测试,仅 2 次测试就显示了过多的断言
【发布时间】:2020-04-26 19:01:45
【问题描述】:

我的测试工作正常,但是当我读到这个article 时,提到了

每个测试方法一个断言

我认为我的测试做出了太多的断言,这是我的测试代码:

<?php

use Laravel\Lumen\Testing\DatabaseMigrations;
use Laravel\Lumen\Testing\DatabaseTransactions;

class GuestTest extends TestCase
{
    use DatabaseTransactions;

    /** @test */
    public function guest_can_register()
    {
        $response = $this->json('POST', '/register', [
            "name" => "Khrisna Gunanasurya",
            "email" => "khrisnagunanasurya@gmail.com",
            "password" => "adminadmin",
            "password_confirmation" => "adminadmin"
        ]);

        $response
                ->seeStatusCode(HttpStatus::$CREATED)
                ->seeJsonStructure([
                    "data" => [
                        "type",
                        "id",
                        "attributes" => [
                            'name',
                            'email'
                        ]
                    ]
                ]);
    }

    /** @test */
    public function registered_guest_can_login()
    {
        $this->post('/register', [
            "name" => "Khrisna Gunanasurya",
            "email" => "khrisnagunanasurya@gmail.com",
            "password" => "adminadmin",
            "password_confirmation" => "adminadmin"
        ]);

        $response = $this->json('POST', '/login', [
            'email' => 'khrisnagunanasurya@gmail.com',
            'password' => 'adminadmin'
        ]);

        $response
                ->seeStatusCode(HttpStatus::$OK)
                ->seeJsonStructure([
                    'data' => [
                        'type',
                        'attributes' => [
                            'token',
                            'token_type',
                            'expires_in'
                        ]
                    ]
                ]);
    }
}

那么我想问的是,对于那些简单的测试,我的测试是否返回了太多的断言?因为我意识到seeJsonStructure() 调用的许多断言取决于嵌套的数组结构,如果我的测试单元做出过多的断言,将来有很多测试文件时会产生问题吗?

编辑

【问题讨论】:

  • 整个“每个测试一个断言”的东西更像是一个指导方针,而不是实际会导致问题的东西。关于它的好处是,当测试失败时,您确切地知道出了什么问题。如果您在 1 个测试中有 100 个断言,则可能更难找到。一般来说,我不会太担心。

标签: php unit-testing phpunit lumen


【解决方案1】:

如果你看一下 assertJsonStructure 的内容,你可以看到这个函数是如何工作的,它基本上迭代所有的键并对响应进行断言。所以在这种情况下

public function assertJsonStructure(array $structure = null, $responseData = null){
    foreach ($structure as $key => $value) {
        if (is_array($value)) {
            PHPUnit::assertArrayHasKey($key, $responseData);
            $this->assertJsonStructure($structure[$key], $responseData[$key]);
        } else {
            PHPUnit::assertArrayHasKey($value, $responseData);
        }
    }
}

所以你有 6 个断言由 assertJsonStructure 生成,另外一个由 seeStatusCode 生成。这将是总共 7 个断言,您有两个测试,它们的总和为 14。

【讨论】:

    猜你喜欢
    • 2017-03-13
    • 2011-10-03
    • 2011-10-10
    • 2013-08-17
    • 2016-06-04
    • 2021-04-20
    • 2020-06-02
    • 2017-02-17
    • 2021-09-27
    相关资源
    最近更新 更多