Tôi có một thủ tục được lưu trữ đơn giản mà giá trị trả về phụ thuộc vào giá trị của inet_client_addr()
. Làm cách nào tôi có thể ghi đè inet_client_addr()
cho mục đích kiểm tra đơn vị khi kiểm tra quy trình được lưu trữ của mình?
Giải pháp duy nhất tôi nghĩ ra cho đến nay là tạo một hàm bao bọc xung quanh inet_client_addr()
:
CREATE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT inet_client_addr();
$$ LANGUAGE sql;
Sau đó sử dụng nó trong chức năng của tôi:
CREATE local_connection() RETURNS BOOLEAN AS $$
SELECT my_inet_client_addr() = '127.0.0.1';
$$ LANGUAGE sql;
Sau đó, trong bài kiểm tra đơn vị của tôi, tôi có thể xác định lại 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;
Có cách nào để thực hiện tương tự mà không có chức năng bao bọc my_inet_client_addr()
?
inet_client_addr()
hoặc nếu chữ ký rất quan trọng thì có sig không có thông số phụ, giao cho người có. Dù bằng cách nào cũng bảo tồn API hiện có trong khi cho phép kiểm tra logic lõi.
local_connection(INET)
hàm (lấy tham số), lần lượt được bao bọc bởi một local_connection()
hàm đi qua inet_client_addr()
. Đây có lẽ là một phương pháp sạch hơn, sẽ bảo tồn API hiện có.
your_procedure( inet_client_addr() )
thay vì một cuộc gọi ngầm đến nó, không yêu cầu chế nhạo / ghi đè.