Question

i utiliser pgtap pour postgresql test des procédures stockées. sa fonction results_eq prend le résultat d'une procédure stockée, il se compare à une défaillance des résultats et rapports attendus si les deux ne sont pas égaux.

est le code que je suis en cours d'exécution:

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');

et c'est la sortie de l'échec:

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

i pourrait être vraiment privé de sommeil, mais ils veulent et ont apparence assez semblable à moi.

Quelqu'un sait pourquoi il est rapporté comme un échec?


mise à jour concernant les détails: voilà comment je définir la procédure stockée en question:

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)
  ...

à suivre peters conseils , j'essayé de changer mon code, mais sans succès:

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');

comme vous pouvez le dire, je suis assez poignarder beaucoup dans l'obscurité même sur la syntaxe de base postgresql - et ni Google, ni la recherche sur postgresql.org quoi que ce soit de retour utile lors de la recherche ::. i finalement hasarda coup de chance que cela pourrait être un opérateur et trouvé :: étant Type fonte. La documentation des paramètres column_name CREATE FUNCTION indique que « RETURNS TABLE aussi implique RETURNS SETOF » qui me fait par exemple et peut-être ici et ici . De nouvelles tentatives:

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');

est inutile, je fais juste devinettes ici. peut aider quelqu'un me avec la bonne syntaxe? S'il vous plaît noter également que la fonction juste RETURNS TABLE parce que c'était la première chose que j'ai pu se rendre au travail, donc s'il y a une solution qui nécessiterait de changer, je suis heureux de le changer.


Mise à jour 2 : RhodiumToad sur le canal IRC postgresql (irc: //irc.freenode.net/#postgresql) m'a aidé avec la syntaxe appropriée. si je connaissais un peu plus sur postgresql que je fais, je aurais pu pensé que cela n'a de sens: deux types de données, deux moulages (DOH!). o)

aussi, en ce moment, il n'y a qu'un seul ensemble de données dans la base de données de test, de sorte que la syntaxe telle qu'elle est utilisée ci-dessus pourrait encore travailler. de tout ce que je comprends, il échoueront probablement une fois il y a plus d'un ensemble de données retourné, il devrait donc être SELECT * FROM, non seulement 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');

ont maintenant et veulent des résultats sont comparés comme égaux et les passes de test. log sortie lorsque les tests sont exécutés:

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 !! : -)

Était-ce utile?

La solution

Vous ne donne pas tous les détails, mais je soupçonne que c'est une incompatibilité de type de données. pgTAP a tendance à exiger des correspondances exactes. Essayez ceci:

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

foo est le type de retour de la fonction select_some_data.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top