тестирование Laravel с поставщиком данных, не работающим с refreshDatabase - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть следующие тесты и правила проверки:

/** @var \App\Http\Requests\StorePopularClientRequest*/
private $rules;

/** @var \Illuminate\Validation\Validator */
private $validator;

public function __construct($name = null, array $data = array(), $dataName = '') {
    parent::__construct($name, $data, $dataName);

    $this->createApplication();
}

public function setUp(): void
{
    parent::setUp();
    $this->adminUser = $this->createUser();
    $this->businessUser = $this->createUser('Business');

    $this->popularClients = factory(PopularClient::class, 20)->create()->each(function($client) {
        static $order = 1;
        $client->order = $order;
        $client->save();
        $order++;
    });

    $this->validator = app()->get('validator');

    $this->rules = (new StorePopularClientRequest())->rules();
}

public function validationProvider()
{
    /* WithFaker trait doesn't work in the dataProvider */
    $faker = Factory::create(Factory::DEFAULT_LOCALE);
    $file = factory(Attachment::class)->create(['category' => 'logo']);
    return [
        'request_should_pass_when_data_is_provided' => [
            'passed' => true,
            'data' => [
                'name' => $faker->company(),
                'description' => $faker->sentence($nbWords = 20, $variableNbWords = true),
                'order' => 1,
                'file' => [
                    "id" => $file->id,
                    "name" => $file->name,
                ]
            ]
        ]
    ];
}

/**
 * @test
 * @dataProvider validationProvider
 * @param bool $shouldPass
 * @param array $mockedRequestData
 */
public function validation_results_as_expected($shouldPass, $mockedRequestData)
{
    $this->assertEquals(
        $shouldPass,
        $this->validate($mockedRequestData)
    );
}

protected function validate($mockedRequestData)
{
    return $this->validator
        ->make($mockedRequestData, $this->rules)
        ->passes();
}

А внутри StorePopularClientRequest У меня есть следующие правила

public function rules()
{
    return [
        "name" => [
            'required','string', 
        ],
        "description" => [
            'required', 'string', 'min:5',
        ],
        'order' => ['required', 'integer'],
        'file' => ['required', 'array'],
        'file.id' => ['required', 'exists:attachments,id'],
        'file.name' => ['required', 'exists:attachments,name'],
    ];
}

Все эти правила работают правильно, кроме exists:attachments, name, exists:attachments,id, из-за использования RefreshDatabase, если комментарий RefreshDatabase, это работает.Так есть ли способ не обновить базу данных до завершения всех тестов, а затем обновить базу данных?

Теперь фабрика вложений работает и создает данные вложений в таблице attachments, но когда я запускаю тест,Таблица вложений обновляется перед тестированием, и существующее правило для вложения недействительно

...