pgtap: ожидаемый и полученный результат равны, но тест не пройден - PullRequest
5 голосов
/ 06 сентября 2011

Я использую pgtap для проверки хранимых процедур postgresql.ее функция results_eq берет результат хранимой процедуры, сравнивает его с ожидаемым результатом и сообщает об ошибке, если оба не равны.

это код, который я выполняю:

PREPARE result_have AS SELECT select_some_data(12345, 'test_string');
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)');
SELECT results_eq('result_have', 'result_want');

и это вывод ошибки:

not ok 21
# Failed test 21: "this should return a result"
#     Columns differ between queries:
#         have: ("(""2010-09-07 06:05:00+00"",100.0)")
#         want: ("(""2010-09-07 06:05:00+00"",100.0)")
# Looks like you failed 1 test of 21

я мог бы быть действительно лишенным сна, но хотел бы и выглядел очень похожим на меня.

кто-нибудь знает, почему этосообщается как сбой?


обновление относительно деталей: так я определяю хранимую процедуру, о которой идет речь:

CREATE OR REPLACE FUNCTION select_some_data
(
    IN p_some_pkey integer,
    IN p_some_code varchar(16)
)
RETURNS TABLE(timestamp_utc timestamp with time zone, value varchar)
  ...

, чтобы следовать Питерс совет , я пытался изменить свой код, но безуспешно:

PREPARE result_have AS SELECT select_some_data(12345, 'test_string');
-- TODO: none of these work, syntax error at or near "TABLE"
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::TABLE(timestamp with time zone, varchar));
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::'TABLE(timestamp with time zone, varchar)');
-- this is the old code...
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)');

SELECT results_eq('result_have', 'result_want');

, как вы, вероятно, можете сказать, я довольно сильно теряю сознание даже из-за основного синтаксиса postgresql - и ни один из Googleни поиск на postgresql.org не возвращает ничего полезного при поиске ::.В конце концов я рискнул предположить, что это может быть оператор, и обнаружил, что :: - это тип приведения .В документации параметров column_name для CREATE FUNCTION говорится, что 'RETURNS TABLE также подразумевает RETURNS SETOF', что приводит меня, например, здесь и, возможно, здесь и здесь .Новые попытки:

PREPARE result_have AS SELECT select_some_data(12345, 'test_string');
-- TODO: doesn't work, syntax error at or near "("
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::SETOF(timestamp with time zone, varchar));
-- TODO: doesn't work, syntax error at or near ","
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::SETOF RECORD(timestamp with time zone, varchar));
-- this is the old code...
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)');

SELECT results_eq('result_have', 'result_want');

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


обновление 2 : RhodiumToad на IRC-канале postgresql (irc: //irc.freenode.net/#postgresql) помог мне с правильным синтаксисом.если бы я знал о postgresql немного больше, чем я, я мог бы подумать, что это имеет смысл только: два типа данных, два приведения (DOH!): o).

также, на данный момент, естьтолько один набор данных в тестовой базе данных, поэтому синтаксис, используемый выше, все еще может работать.насколько я понимаю, он, скорее всего, потерпит неудачу, когда будет возвращено более одного набора данных, поэтому он должен быть SELECT * FROM, а не просто SELECT:

PREPARE result_have AS SELECT * FROM select_some_data(12345, 'test_param_code');
PREPARE result_want AS VALUES ('2010-09-07 06:05:00+00'::timestamp with time zone, '100.0'::varchar);

SELECT results_eq('result_have', 'result_want', 'have and want should be equal');

теперь иметь и результаты хотят сравнивать как равныеи тест проходит.вывод журнала при запуске тестов:

ok 21 - have and want should be equal
ok
All tests successful.
Files=1, Tests=21,  1 wallclock secs ( 0.02 usr  0.00 sys +  0.05 cusr  0.03 csys =  0.10 CPU)
Result: PASS

WOOT !!: -)

1 Ответ

4 голосов
/ 07 сентября 2011

Вы не даете все детали, но я подозреваю, что это несоответствие типов данных. pgTAP обычно требует точных совпадений. Попробуйте это:

PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::foo);

где foo - тип возврата функции select_some_data.

...