【问题标题】:Class Validator error in Php Unit Testing in Laravel 5.5Laravel 5.5 中 PHP 单元测试中的类验证器错误
【发布时间】:2020-02-19 00:49:44
【问题描述】:

我正在 laravel 5.5 中进行 phpUnit 测试。当我尝试通过创建请求对象并将其作为参数传递来使用 2 种不同的方法在控制器上测试该方法时,我遇到了同样的错误,但是当我在 Postman 上测试时它工作正常

"ReflectionException: 类验证器不存在 /src/vendor/laravel/framework/src/Illuminate/Container/Container.php:752 /src/vendor/laravel/framework/src/Illuminate/Container/Container.php:631 /src/vendor/laravel/framework/src /Illuminate/Container/Container.php:586 /src/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:732 /src/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:110 /src/vendor/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php:96 /src/vendor/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php:44"

编写测试用例的两种方法

1)

$response = $this->withHeaders([ 'Content-type' => 'application/json' ])->json('POST', '/account', $jsonArr);

2)

$request = Request::create('/account', 'POST', $jsonArr); 
   $request->headers->set('Content-type', 'application/json'); 
   $controller = new AccountController;
   $response = $controller->create($request);

我的代码:

************************AccountController.php************************ **********

<?php

namespace App\Http\Controllers;
use Illuminate\Support\Facades\Validator;
use App\Models\Account;

class AccountController extends Controller
{
    public function create(Request $request)
        {
        $this->validate($request, $this->rules());          
        $service_name = "seller-registration-accepted";
        $id_array = array();
        $link_array = array();
        $account = new Account;
        $account->id = $account_id;
        $account->company_name = $request->company_name;
        $account->email = $request->email;
        $account->phone = $request->phone;
        $account->address = $request->address;
        $account->language = $request->language;
        $account->account_type_id = 5;
        $this->insertCompanyDescription($request, $account_id);
        $customerRes = PaymentGatewayUtil::createCustomer();
        if (((json_decode($customerRes))->status == "success")) {
            $customer = new Customer;
            $customer->account_id = $account_id;
            $customer->id =  ((json_decode($customerRes))->data)->customer_id;
            $customer->save();
        }
        return JSendResponse::success(['message' =>
        'Seller registration accepted successfully, seller account created.',
        'id' => $account->id]);
    }

    private function rules()
    {
        return [
            'company_name' => 'sometimes',
            'email' => 'required|email',
            'phone' => 'required',
            'language' => 'required',
            'account_type' => 'required',
            'translations' => 'sometimes',
            'translations.*.company_description' => 'required',
            'translations.*.locale' => 'required',
            'website_link' => 'sometimes|URL'
        ];
    }

} 

**************************AccountControllerTest.php****************** ***

<?php
namespace Tests\Feature;

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use App\Http\Controllers\AccountController;
use Exception;

class AccountControllerTest extends TestCase
{
    public function testCreateTest()
    {
        $uniqueEmailAddress = "test_".rand(1000, 9999)."@gmail.com";
        $jsonArr = array();
        $jsonArr['email'] = $uniqueEmailAddress;
        $jsonArr['company_name'] = "test_47";
        $jsonArr['address'] = "XYZ";
        $jsonArr['service_type'] = 'partner';
        $jsonArr['account_type'] = 'seller';
        $jsonArr['language'] = 'en';
        $jsonArr['phone'] = '00000000000';
        $response =  $this->withHeaders([
              'Content-type' => 'application/json'
         ])->json('POST', '/account', $jsonArr);
    }



    public function testCreateTest2()
    {
        $uniqueEmailAddress = "test2_".rand(1000, 9999)."@gmail.com";
        $jsonArr = array();
        $jsonArr['email'] = $uniqueEmailAddress;
        $jsonArr['company_name'] = "test_23";
        $jsonArr['address'] = "XYU";
        $jsonArr['service_type'] = 'partner';
        $jsonArr['account_type'] = 'seller';
        $jsonArr['language'] = 'en';
        $jsonArr['phone'] = '00000000000';


        $request = $this->convertToRequest($jsonArr);
        $request = Request::create('/account', 'POST', $jsonArr);
        $request->headers->set('Content-type', 'application/json');
        $controller = new AccountController;
        $response = $controller->create($request);
        }
    } 

**********************routes/api.php************************ ***

<?php


Route::post('/account', 'AccountController@create'); 

【问题讨论】:

    标签: php laravel phpunit


    【解决方案1】:

    我认为您应该使用 laravel 测试辅助方法改进您的测试方法,而不是尝试模拟请求,因为您不会完全加载中间件和请求依赖项。

    类似的东西。

    <?php
    
        public function testCreateTest2()
            {
                $uniqueEmailAddress = "test2_".rand(1000, 9999)."@gmail.com";
                $jsonArr = array();
                $jsonArr['email'] = $uniqueEmailAddress;
                $jsonArr['company_name'] = "test_23";
                $jsonArr['address'] = "XYU";
                $jsonArr['service_type'] = 'partner';
                $jsonArr['account_type'] = 'seller';
                $jsonArr['language'] = 'en';
                $jsonArr['phone'] = '00000000000';
    
                $response = $this->json('POST', '/account', $jsonArr);
    
                $response->assertStatus(200)
                ->assertJsonFragment(['message' => 'Seller registration accepted successfully, seller account created.'])
                }
            } 
    

    并且可能创建另一个测试来测试验证器

    <?php
    
        public function testCreateTest2()
            {
                $uniqueEmailAddress = "";
                $jsonArr = array();
                $jsonArr['email'] = $uniqueEmailAddress;
                $jsonArr['company_name'] = "test_23";
                $jsonArr['address'] = "XYU";
                $jsonArr['service_type'] = 'partner';
                $jsonArr['account_type'] = 'seller';
                $jsonArr['language'] = 'en';
                $jsonArr['phone'] = '00000000000';
    
                $response = $this->json('POST', '/account', $jsonArr);
    
                $response->assertStatus(422)
                ->assertJsonFragment(['email' => 'Email is required.'])
                }
            } 
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 2017-05-23
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2018-05-02
      • 2018-07-13
      相关资源
      最近更新 更多