Ошибка валидатора класса в модульном тестировании Php в Laravel 5.5 - PullRequest
0 голосов
/ 22 октября 2019

Я работаю над тестом phpUnit в laravel 5.5. Когда я пытаюсь протестировать метод на контроллере двумя различными способами, создав объект запроса и передав его в качестве параметра, я получаю ту же ошибку, но она работает нормально, когда я тестирую на 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 / Ill/Foundation/helpers.php:110 /src/vendor/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php:96 /src/vendor/laravel/framework/src/Illuminate/Foundation/alpateres: 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.pл.с. **********************************

<?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);
        }
    } 
* *********************** маршруты тысячи двадцать-два / api.php ***********************
<?php


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

1 Ответ

0 голосов
/ 23 октября 2019

Я думаю, вам следует улучшить свой подход к тестированию, используя вспомогательные методы тестирования 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.'])
            }
        } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...