我的控制器如下:
public function store(Request $request) {
$validateData = $request->validate([
'name' => 'required|unique:languages',
'code' => 'required|size:3',
'flag' => 'required|size:2'
]);
$language = new Language();
$language->name = $request->name;
$language->code = $request->code;
$language->flag = $request->flag;
$saveLanguage = $language->save();
if(!$saveLanguage){
return response()->json(['error'=>'Something went wrong, please try later.'],500);
}
return response()->json(['success'=>'Language has been created successfully', 'data'=>$language],200);
如您所见,我正在实例化一个新的Language对象,并且一切正常,但是第一个问题是,假设我将来更改Language类(例如:您必须在构造函数中传递2个参数),我必须进行更改该控制器以及我要实例化Language
对象的所有其他控制器。
第二个问题是我做不到,或者测试这个控制器太难了。
我很好奇在laravel中解决此问题的最佳解决方案是什么?
例如,对于我在控制器中使用的每个模型,使用简单的工厂或工厂方法模式是一个很好的解决方案。
我认为当您在其他类中编写类似$var = new SomeClass()
的内容时,此otherClass
取决于SomeClass,并且当您要更改SomeClass
时必须更新otherClass
至。您如何看待这一点,我该如何避免。
答案 0 :(得分:0)
或者您可以使用雄辩的Create
函数,这样就不必担心构造函数。
$language = Language::create($request->only(['name', 'code', 'flag']));
此函数会将数据插入数据库并返回模型。
答案 1 :(得分:0)
您可以使用 Jerodev 中所述的Eloquents create 函数,但是如果需要您的新字段,您将在此端点上收到必填字段错误
因此,您有2个选项,或者在更改代码后测试所有端点 或者您可以为此编写功能测试。哪个会自动为您完成 简单来说,如果您收到其他必填字段,则该测试将失败。
P.S:如果您使用原始数据库,请记住;第二次运行此代码时,您可能会出现复制错误。因此,对于测试而言,最好使用基于内存的数据库,该数据库会在进度完成后破坏自身。像SQLLITE这样的方式也不会将垃圾测试数据添加到数据库中。
这是您的函数的示例测试代码。
public function testBasicTest()
{
$response = $this->post('your_route', ['name' => 'LanguageName', 'code' => 'Code', 'flag' => 'Flag']);
$data = json_decode($response->getContent(), True)['data'];
$language = Language::latest()->first()->toArray();
$response->assertStatus(200);
$this->assertEquals($data, $language);
}