Модульное тестирование Laravel, как" seeInDatabase " мягкая удаленная строка?

Я работаю над небольшим модульным тестом, где я мягко удаляю строку. Чтобы отметить тест как успешный, я должен найти эту строку с:

  • заданный ID и
  • deleted_at колонки не должно быть null.

Я могу выполнить первое условие - потому что очевидно, я знаю код.

к сожалению, я не знаю, как сказать seeInDatabase метод, который я ожидаю deleted_at не будет null:

$this->seeInDatabase(
       'diary_note_categories',
       [
           'id' => 'a7e35ad0-6f00-4f88-b953-f498797042fc',
           'deleted_at' => null // should be is not null, like <> or != or whatever
       ]
 );

любой намеки?

'deleted_at <>' => null разрывы

'deleted_at' => ['!=' => null] разрывы, а также

4 ответов


в настоящее время невозможно. Оба!--3--> и notSeeInDatabase просто передайте массив непосредственно в where метод построителя запросов, и это не понимает, как иметь дело ни с чем, кроме = при передаче массива.

https://github.com/laravel/framework/blob/2b4b3e3084d3c467f8dfaf7ce5a6dc466068b47d/src/Illuminate/Database/Query/Builder.php#L452

public function where($column, $operator = null, $value = null, $boolean = 'and')
{
    // If the column is an array, we will assume it is an array of key-value pairs
    // and can add them each as a where clause. We will maintain the boolean we
    // received when the method was called and pass it into the nested where.
    if (is_array($column)) {
        return $this->whereNested(function ($query) use ($column) {
            foreach ($column as $key => $value) {
                $query->where($key, '=', $value);
            }
        }, $boolean);
    }

    // ...
}

Вариант 1-добавьте следующий код в свой класс TestCase, который вы расширьте свои тестовые случаи с

суть:https://gist.github.com/EspadaV8/73c9b311eee96b8e8a03

<?php
/**
 * Assert that a given where condition does not matches a soft deleted record
 *
 * @param  string $table
 * @param  array  $data
 * @param  string $connection
 * @return $this
 */
protected function seeIsNotSoftDeletedInDatabase($table, array $data, $connection = null)
{
    $database = $this->app->make('db');

    $connection = $connection ?: $database->getDefaultConnection();

    $count = $database->connection($connection)
        ->table($table)
        ->where($data)
        ->whereNull('deleted_at')
        ->count();

    $this->assertGreaterThan(0, $count, sprintf(
        'Found unexpected records in database table [%s] that matched attributes [%s].', $table, json_encode($data)
    ));

    return $this;
}

/**
 * Assert that a given where condition matches a soft deleted record
 *
 * @param  string $table
 * @param  array  $data
 * @param  string $connection
 * @return $this
 */
protected function seeIsSoftDeletedInDatabase($table, array $data, $connection = null)
{
    $database = $this->app->make('db');

    $connection = $connection ?: $database->getDefaultConnection();

    $count = $database->connection($connection)
        ->table($table)
        ->where($data)
        ->whereNotNull('deleted_at')
        ->count();

    $this->assertGreaterThan(0, $count, sprintf(
        'Found unexpected records in database table [%s] that matched attributes [%s].', $table, json_encode($data)
    ));

    return $this;
}

Вариант 2-Установите следующий пакет composer

этот пакет composer является точно таким же кодом, как и выше, но упакован для Composer.

composer require kirkbater/soft-deletes

затем используйте его внутри вашего конкретного тестового класса:

<?php

use Kirkbater\Testing\SoftDeletes;

class MyTestClass extends TestClass {

    use SoftDeletes;

}

Я сделал это таким образом:

$this->seeInDatabase('diary_note...',['id' => 'a7e35ad0'])
->notSeeInDatabase('diary_note...',['id' => 'a7e35ad0','deleted_at'=>null]);

поэтому я проверяю в два шага

  1. Я проверяю, есть ли запись с нашим идентификатором в таблице
  2. Я проверяю, нет ли записи с нашим id и deleted_at = null в таблице

Это старый вопрос, но для тех, кто использует более поздние версии Laravel (5.4 и выше), теперь есть assertSoftDeleted утверждение: документация.

таким образом, ответ на исходный вопрос теперь такой:

$this->assertSoftDeleted('diary_note_categories', [
    'id' => 'a7e35ad0-6f00-4f88-b953-f498797042fc'
]);

он не тестируется, но попробуйте так:

$this->seeInDatabase(
       'diary_note_categories',
       [
           'id' => 'a7e35ad0-6f00-4f88-b953-f498797042fc',
           'deleted_at' => ['deleted_at' ,'!=', null ] // should be is not null, like <> or != or whatever
       ]
 );