Laravel - 测试 - assertJsonMissingExact

Posted

技术标签:

【中文标题】Laravel - 测试 - assertJsonMissingExact【英文标题】:Laravel - Testing - assertJsonMissingExact 【发布时间】:2021-03-31 19:45:58 【问题描述】:

我不得不承认这是我第一次使用这种方法

在描述之前,这里是本案例中的 Laravel 和 php 版本。 拉拉维尔:8.15 PHP:7.4.13

我的路线:
Route::get('/', function () 
    return ['a' => 1, 'b' => 2, 'c' => 3];
当我的测试方法如下时,它失败了,这是我的预期
    public function testDemo()
    
        $response = $this->get('/')->assertJsonMissing(['a' => 1, 'b' => 3]);
    
然后,我使用了 assertJsonMissingExact,我预计它会通过。
    public function testDemo()
    
        $response = $this->get('/')->assertJsonMissingExact(['a' => 1, 'b' => 3]);
    
但是,它没有通过。相反,这里是消息
This test did not perform any assertions

Time: 00:00.178, Memory: 20.00 MB


OK, but incomplete, skipped, or risky tests!
Tests: 1, Assertions: 0, Risky: 1.
Process finished with exit code 0

它说测试没有执行任何断言。我想知道这是否正常?因为我期待passed 结果。

任何人都可以帮助我,我们将不胜感激。

【问题讨论】:

【参考方案1】:

对你来说可能为时已晚,但对于下一个想了解这两种方法的人(比如我)来说可能不是。

查看两者的基本实现

照亮/测试/AssertableJsonString::assertMissing() 在简化代码中(省略数组排序)

public function assertMissing(array $data, $exact = false)

    $actual = json_encode($actualData);

    foreach ($data as $key => $value) 
        if (Str::contains($actual, $unexpected)
           PHPUnit::Fail()
        
    

    return $this;

照亮/测试/AssertableJsonString::assertMissingExact()

简化代码

public function assertMissing(array $data, $exact = false)

    $actual = json_encode($actualData);

    foreach ($data as $key => $value) 
        if (! Str::contains($actual, $unexpected)
           return $this;
        
    

    PHPUnit::Fail()

因此,如果整个数组在实际数据中,则 assertJsonMissing 失败,而如果至少一个键 => 值对在实际数据中,则 assertJsonMissingExact 失败,在您的情况下为 'a' => 1

【讨论】:

以上是关于Laravel - 测试 - assertJsonMissingExact的主要内容,如果未能解决你的问题,请参考以下文章

使用Laravel测试JSON响应

Laravel 测试 | Laravel Artisan 命令中的模拟对象

在 laravel 的测试套件中只运行一个单元测试

测试一个 Laravel 包

掌握 Laravel 的测试方法

Laravel 测试请求集正文