Тестирование PHP JSON содержит SQLite - PullRequest
0 голосов
/ 25 мая 2018

Мое веб-приложение использует Laravel & MySQL, но для своих тестов я использую SQLite в памяти.

Это мой код, который я использую в своем контроллере:

$opportunities = DB::table('opportunities')
        ->whereRaw('JSON_CONTAINS(businesses, \'"' . $business . '"\')')
        ->get();

При тестировании этоговыдает исключение из-за того, что SQLite не имеет функции JSON_CONTAINS.Как я могу обойти это так, чтобы мои тесты прошли, и мне не нужно было вносить какие-либо масштабные изменения в структуру?Есть ли в SQLite функция для этого или что-то в этом роде?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Вы можете эмулировать JSON_CONTAINS во время тестирования, используя sqlite_create_function например,

function json_contains($json, $val) {
  $array = json_decode($json, true);
  // trim double quotes from around the value to match MySQL behaviour
  $val = trim($val, '"');
  // this will work for a single dimension JSON value, if more dimensions
  // something more sophisticated will be required
  // that is left as an exercise for the reader
  return in_array($val, $array);
}

sqlite_create_function(<your db handle>, 'JSON_CONTAINS', 'json_contains');

Вы также можете эмулировать необязательный третий параметр JSON_CONTAINS, например,

function json_contains($json, $val, $path = null) {
  $array = json_decode($json, true);
  // trim double quotes from around the value to match MySQL behaviour
  $val = trim($val, '"');
  // this will work for a single dimension JSON value, if more dimensions
  // something more sophisticated will be required
  // that is left as an exercise for the reader
  if ($path)
    return $array[$path] == $val;
  else
    return in_array($val, $array);
}
0 голосов
/ 25 мая 2018

Я перестал запускать свой набор тестов на SQLite, потому что между реализациями слишком много различий.Первой проблемой было отсутствие поддержки перечислений, но когда даже простые вещи, такие как операторы ALTER вызывали проблемы, я тоже переключился на MySQL для тестирования.

Что я делаю сейчас, так это задаю имя моей базы данных тестированияв phpunit.xml.

<phpunit>
    <php>
        <env name="DB_DATABASE" value="mydb_testing"/>
    </php>
</phpunit>

Недостатком этого является необходимость создания двух баз данных для разработки приложения, но я должен быть уверен, что миграции будут работать на производстве, которое использует MySQL и тестированиена SQLite это не доказывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...