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()
?
postgresql
stored-procedures
unit-test
Schwach
quelle
quelle
your_procedure( inet_client_addr() )
Anstelle eines impliziten Aufrufs ist kein Verspotten / Überschreiben erforderlich.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 einerlocal_connection()
Funktion umschlossen wird , die übergeben wirdinet_client_addr()
. Dies ist wahrscheinlich eine sauberere Methode, bei der die vorhandene API erhalten bleibt.Antworten:
inet_client_addr()
ist eine Systeminformationsfunktion.Es befindet sich
pg_catalog
wie andere integrierte Funktionen im Schema (mit Ausnahme zusätzlicher Module).pg_catalog
ist automatisch Teil dersearch_path
. Pro Dokumentation:Meine kühne Betonung.
Also erstellen wir ein dediziertes Schema und platzieren es vorher
pg_catalog
insearch_path
:Dann findet Ihr Anruf zuerst Ihre benutzerdefinierte Überschreibungsfunktion:
SQL Fiddle
Stellen Sie sicher, dass nicht privilegierte Benutzer keine Objekte im
override
Schema erstellen oder Ihnen alle möglichen Streiche spielen können. Dies ist standardmäßig nicht der Fall. Pro Dokumentation:Meine kühne Betonung.
Vorsicht ist geboten, wenn derselbe Benutzer Objekte in der Datenbank erstellen darf .
Pro Dokumentation:
CREATE
Geben Sie immer einen Schemanamen für Befehle an und lassen Sie das Kistenobjekt standardmäßig nicht für alle zu, um Fehler auszuschließen.quelle
pg_catalog
im Suchpfad war das fehlende Teil. Vielen Dank!Muss
postgres
Benutzer oder andereSuperuser
für meine sein. Ich brauche nurcreate schema
Privilegien für Erwins Antwort.Tests starten:
Tests beenden
quelle