今天我们要学习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 基本介绍
Scope介绍 w3schools:Scope determines the accessibili...
本篇重点 Kbars 介绍及属性说明 使用 Pandas 将 Kbars 资料转换为 DataFra...
Shimmer iOS Swift的话是类似SkeletonView 一般用在等待的时候 像是API...
Given two sorted arrays nums1 and nums2 of size m ...
後来发现 , 之前说明了 Vue . React Component 如何变成 Web Compon...