如何测试laravel控制器方法?

时间:2018-11-20 08:25:51

标签: php laravel testing design-patterns

我的控制器如下:

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至。您如何看待这一点,我该如何避免。

2 个答案:

答案 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);
 }
相关问题