Вызов Query с args [] не ожидался в go-sqlmock для составных SQL-запросов.
Мне удалось смоделировать запрос для выбора из одной таблицы следующим образом:
sqlMock.ExpectQuery("^SELECT DISTINCT (.+) FROM myTable1, myTable2").
WillReturnRows(myResultRows)
Но я не смог издеваться над следующим запросом, который проверяет наличие таблицы в моем postgres db:
SELECT EXISTS
( SELECT 1
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'myTable3' );
Сочетание:
existsRows := sqlmock.NewRows([]string{"exists"}).
AddRow(true)
А ТАКЖЕ
slMock.ExpectQuery("^SELECT EXISTS").
WillReturnRows(existsRows)
Я пытался издеваться SELECT 1
тоже, но я получаю ту же ошибку:
time="2019-09-27T15:49:41-07:00" level=panic msg="db query" error="call to Query 'SELECT EXISTS\n\t\t( SELECT 1\n\t\tFROM information_schema.tables\n\t\tWHERE table_schema = 'public'\n\t\t AND table_name = 'myTable3' );' with args [], was not expected, next expectation is: ExpectedExec => expecting Exec or ExecContext which......
Пакеты, которые я использую:
import (
"database/sql"
"db"
"os"
"testing"
// not explicitly called
_ "github.com/denisenkom/go-mssqldb"
_ "github.com/lib/pq"
"github.com/DATA-DOG/go-sqlmock"
"github.com/sirupsen/logrus"
)
Любые идеи или указатели приветствуются. Я не нашел подходящих примеров в Интернете
2 ответа
Фактически,
sqlMock.ExpectQuery("SELECT EXISTS \\( SELECT 1 FROM information_schema\\.tables WHERE table_schema = 'public' AND table_name = 'myTable3' \\);").
WillReturnRows(existsRows)
сделали свое дело.
Больше примеров здесь:https://chromium.googlesource.com/external/github.com/DATA-DOG/go-sqlmock/+/e36ad8d068217ee8e4df50408476b153e115e3e6/README.md
Я также использовал regex101.com
Подсказка заключалась в том, что он сразу же ожидал следующего запроса. Итак, мы знали, что это вообще не читалось. Мой коллега указал на это:)
Я не уверен, но думаю, что проблема в вашем отступе запроса ur, попробуйте удалить разрыв строки или табуляцию в вашем запросе SELECT EXISTS
( SELECT 1
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'myTable3' );
Нравится SELECT EXISTS( SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'myTable3' );