【发布时间】:2023-03-08 09:29:01
【问题描述】:
我目前在 Laravel 中测试函数时遇到了一些麻烦。这个函数是一个简单的保存用户函数。
当前结构涉及一个用户
class User extends Authenticatable
然后我有一个用户控制器
class UserController extends Controller
{
protected $user;
public function __construct(User $user)
{
$this->user = $user;
$this->middleware('admins');
}
保存函数是在UserController类上定义的,该类只分配请求变量,使用Eloquent保存函数保存到数据库。
函数签名如下:
public function storeUser($request)
{
$this->user->name = $request->name;
$this->user->email = $request->email;
$this->user->country_id = $request->country_id;
return $this->user->save();
}
NewAccountRequest 对象从 Request 扩展而来,并具有请求的验证规则。
class NewAccountRequest extends Request
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:user',
'password' => 'required|min:6|max:60',
];
}
}
我的问题是如何对这个 storeUser 函数进行单元测试。
我有当前的测试:
public function testSaveUserWithEmptyRequest()
{
$user = $this->createMock(User::class);
$controller = new UserController($user);
$request = $this->createMock(NewAccountRequest::class);
$store = $controller->storeUser($request);
$this->assertFalse($store);
}
我在嘲笑 User 和 NewAccountRequest,问题是断言应该是错误的,来自 Eloquent 保存。相反,我得到了 Null。关于如何正确测试该功能的任何想法?
【问题讨论】:
-
saveUser函数里面有什么,你是否缺少返回语句? -
@ShadyAtef 使用 StoreUser 代码更新了问题并更正了呼叫名称。
-
我明白了,你模拟了
User::class.. 在 PHPUnit 中,createMock将对象的所有函数替换为不执行任何操作并返回空值的虚拟函数。事实上,要在 laravel 中测试数据库操作,您必须使用DatabaseMigrations或DatabaseTransactions提供的两个特征之一 -
但是我不是在嘲笑UserController,它不应该因为请求为空而返回false吗?
-
但是返回行只是在
$user上调用了一个你已经模拟并传递的函数
标签: php laravel unit-testing laravel-5 phpunit