Модульное тестирование 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
метод построителя запросов, и это не понимает, как иметь дело ни с чем, кроме =
при передаче массива.
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]);
поэтому я проверяю в два шага
- Я проверяю, есть ли запись с нашим идентификатором в таблице
- Я проверяю, нет ли записи с нашим 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
]
);