2009-07-01 53 views
3

我有我已經宣佈了一些常量Perl模塊:有沒有在單元測試中重寫Perl「使用常量」的方法?

use constant BASE_PATH => "/data/monitor/"; 

在現場操作的常數將不會改變,但我希望能夠對其進行修改 在我的單元測試,例如將其設置爲〜/ project/testdata/。有沒有辦法做到這一點 而不必使用「非常量」?

我可以在constant.pm上使用Test :: MockObject嗎?

+0

如果你需要在整個測試過程中改變它,爲什麼不讓它成爲'非常量' – user105033 2009-07-01 15:35:20

+0

你可以嘗試猴子修補常量的導入子程序。 – daotoad 2009-07-01 17:36:10

+0

爲什麼你會這樣做,而不是有一個配置文件? – 2009-07-02 14:21:46

回答

6

當使用它們被實現爲恆定的功能行爲類似常量:

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"; 

雖然你爲什麼會想這樣做我」我不太確定。

+0

記得把它放在正確的包裝中。 – 2009-07-01 18:06:01

1

顯然,如果使用您的BASE_PATH的定義/編譯成另一個子程序之前,你的測試並改變它(通過

*BASE_PATH = sub { ... } 

或其他的東西),你有沒有解決方案(因爲在原來的模塊使用BASE_PATH作爲一個常數,它真的定義是,那麼,在其他代碼中使用)時,內聯

2
 
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... 
5

測試通常會顯示設計中的不靈活性。這是其中的一次。這個常數不應該是恆定的。

如果你是出於性能原因這麼做,我願意打硬通貨,它沒有任何區別。

相關問題