我有我已經宣佈了一些常量Perl模塊:有沒有在單元測試中重寫Perl「使用常量」的方法?
use constant BASE_PATH => "/data/monitor/";
在現場操作的常數將不會改變,但我希望能夠對其進行修改 在我的單元測試,例如將其設置爲〜/ project/testdata/。有沒有辦法做到這一點 而不必使用「非常量」?
我可以在constant.pm上使用Test :: MockObject嗎?
我有我已經宣佈了一些常量Perl模塊:有沒有在單元測試中重寫Perl「使用常量」的方法?
use constant BASE_PATH => "/data/monitor/";
在現場操作的常數將不會改變,但我希望能夠對其進行修改 在我的單元測試,例如將其設置爲〜/ project/testdata/。有沒有辦法做到這一點 而不必使用「非常量」?
我可以在constant.pm上使用Test :: MockObject嗎?
當使用它們被實現爲恆定的功能行爲類似常量:
use subs 'BASE_PATH';
sub BASE_PATH() {"/data/monitor/"}
中是內聯的程序BASE_PATH的任意用途,因此不能被修改。
來實現類似的,你可以手動使用潛艇編譯(使BASE_PATH表現爲一個內置的功能),並宣佈BASE_PATH作爲一個標準功能:
use subs 'BASE_PATH';
sub BASE_PATH {"/data/monitor/"}
print "BASE_PATH is ".BASE_PATH."\n";
*BASE_PATH = sub {"/new/path"};
print "BASE_PATH is ".BASE_PATH."\n";
雖然你爲什麼會想這樣做我」我不太確定。
記得把它放在正確的包裝中。 – 2009-07-01 18:06:01
顯然,如果使用您的BASE_PATH的定義/編譯成另一個子程序之前,你的測試並改變它(通過
*BASE_PATH = sub { ... }
或其他的東西),你有沒有解決方案(因爲在原來的模塊使用BASE_PATH作爲一個常數,它真的定義是,那麼,在其他代碼中使用)時,內聯
package My::Class; use constant BASE_PATH => "https://stackoverflow.com/a/real/value/"; # ..more code here.. 1;
現在在單元測試中的內聯函數:
use My::Class; *{My::Class::BASE_PATH} = sub { "https://stackoverflow.com/a/fake/value" }; # do your tests here...
測試通常會顯示設計中的不靈活性。這是其中的一次。這個常數不應該是恆定的。
如果你是出於性能原因這麼做,我願意打硬通貨,它沒有任何區別。
如果你需要在整個測試過程中改變它,爲什麼不讓它成爲'非常量' – user105033 2009-07-01 15:35:20
你可以嘗試猴子修補常量的導入子程序。 – daotoad 2009-07-01 17:36:10
爲什麼你會這樣做,而不是有一個配置文件? – 2009-07-02 14:21:46