Ich habe eine einfache gespeicherte Prozedur, deren Rückgabewert vom Wert von abhängt inet_client_addr()
. Wie kann ich überschreibeninet_client_addr()
beim Testen meiner gespeicherten Prozedur zum Zwecke von Komponententests ?
Die einzige Lösung, die ich bisher gefunden habe, besteht darin, eine Wrapper-Funktion zu erstellen inet_client_addr()
:
CREATE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT inet_client_addr();
$$ LANGUAGE sql;
Dann benutze das in meiner Funktion:
CREATE local_connection() RETURNS BOOLEAN AS $$
SELECT my_inet_client_addr() = '127.0.0.1';
$$ LANGUAGE sql;
Dann kann ich in meinem Unit-Test Folgendes neu definieren my_inet_client_addr()
:
BEGIN;
SELECT PLAN(2);
REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT '127.0.0.1'::INET;
$$ LANGUAGE sql;
is(local_connection(),TRUE,'Connection from 127.0.0.1 is local');
REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT '192.168.1.1'::INET;
$$ LANGUAGE sql;
is(local_connection(),FALSE,'Connection from 192.168.1.1. is not local');
ROLLBACK;
Gibt es eine Möglichkeit, dies auch ohne die Wrapper-Funktion zu erreichen my_inet_client_addr()
?
inet_client_addr()
, oder wenn Signaturen sehr wichtig sind, haben Sie das Sig delegieren Sie ohne den zusätzlichen Parameter an den mit. In beiden Fällen bleibt die vorhandene API erhalten, während die Kernlogik getestet werden kann.
local_connection(INET)
Funktion erstellen (die das Argument übernimmt), die wiederum von einer local_connection()
Funktion umschlossen wird , die übergeben wird inet_client_addr()
. Dies ist wahrscheinlich eine sauberere Methode, bei der die vorhandene API erhalten bleibt.
your_procedure( inet_client_addr() )
Anstelle eines impliziten Aufrufs ist kein Verspotten / Überschreiben erforderlich.