Day18 跟着官方文件学习Laravel-Mock

今天我们要学习Mock,在写测试时,有些情况我们不想再测时执行某些方法,造成一些麻烦,我们希望这些方法有别的物件帮我们模拟出来,这时候我们可以用Mock帮我们。
今天我们要使用Mock,帮我们制造一些情境,我们回顾一下前面测试的store方法,发现到PDOException catch後的地方没有测试到,我希望能够将它写进测试当中,但我想不到其他手段去制造PDOException的情境,因此,我们来制造一个替身,这个替身会帮我们制造PDOException,让我们可办法去预测catch後的结果。

来看一下我们的store方法

public function store(Request $request, UserService $userService)
    {
        $account = $request->account;
        $password = $request->password;
        $username = $request->username;
        try{
            if($userService->signUp($account, $password, $username)){
                return response()->json([
                    'success' => 'true'
                ]);
            }
        } catch (PDOException $e){
            return response()->json([
                'success' => 'false',
                'error'=> 'DB error'
            ]);
        }catch (\Exception $e){
            return response()->json([
                'success' => 'false',
                'error'=> $e->getMessage()
            ]);
        }
    }

我们若要捕捉到PDOException,我们需要让$userService执行signUp时,丢出一个PDOException,有两种方法,一种是真的制造这个情境(我想不到),另一种是利用Mock制造替身帮我们做。

希望呼叫store,在Service Provider再注入UserService时,不要放真身,而是制造一个替身放入,这个替身在执行signUp时,帮我们丢出PDOException

$this->mock(UserService::class, function (MockInterface $mock) {
            $mock->shouldReceive('signUp')
                ->andThrow(new PDOException());
        });
    );

好我们的测试写法如下,首先我们先制造一个mock在要注入UserService替换掉,接着就是执行动作,那在执行到signUp时,他会帮我们丢出PDOException,接着就catch并显示结果。我们预期他会得到{
'success' => 'false',
'error'=> 'DB error'
}

/**
     * @test
     */
    public function storeGetPDOException()
    {
        //arrange
        $this->mock(UserService::class, function (MockInterface $mock) {
            $mock->shouldReceive('signUp')
                ->andThrow(new PDOException());
        });
        $id = 10;
        $account = "JimChien";
        $username = "Jim";
        $password = "123Acb_";

        // act&assert
        $this->postJson("/api/user", [
            'id'=>$id,
            'account'=>$account,
            'password'=>$password,
            'username'=>$username
        ])
        ->assertStatus(200)
        ->assertJson([
            'success' => 'false',
            'error'=> 'DB error'
        ]);
    }


好~!今天测试到这边~~!


<<:  17 - Traces - 观察应用程序的效能瓶颈 (1/6) - Elastic APM 基本介绍

>>:  [Java Day21] 5.1. 私有化

[Day 19] JS - 作用域 Scope

Scope介绍 w3schools:Scope determines the accessibili...

Day 08 - Kbars

本篇重点 Kbars 介绍及属性说明 使用 Pandas 将 Kbars 资料转换为 DataFra...

[Day24] Flutter with GetX Shimmer

Shimmer iOS Swift的话是类似SkeletonView 一般用在等待的时候 像是API...

[C#] LeetCode 4. Median of Two Sorted Arrays 浅谈中位数

Given two sorted arrays nums1 and nums2 of size m ...

[day28] - Angular Component to Web Component

後来发现 , 之前说明了 Vue . React Component 如何变成 Web Compon...