2013-09-16 33 views
3

我正在尋找一種方法來測試子例程,方法是使用perl模塊Test::MockModule嘲笑它調用的子例程。Perl模塊Test :: MockModule和調用者

假設我們測試一個子My::Module::A()。它調用sub My::New::B()。爲了測試My::Module::A(),我模擬了My::New::B()。然而,My::New::B()調用另一個子My::Calc::C()來做一些計算。必須在嘲笑的子目錄中撥打My::Calc::C()

my $module = Test::MockModule->new('My::New'); 
    $module->mock(B => sub($$) 
    { 
     my ($first, $second) = @_; 

     My::Calc::C(); 
    }); 

My::Calc::C()需要知道誰的話來說,但是作爲主叫收到'main::test',而不是'My::New::B'。有沒有辦法告訴My::Calc::C()它被模擬的My::New::B()調用,而不是main::test()

回答

1

package關鍵字設置當前的通話包。你可以把它放在大括號中,以限制它到一個特定的範圍:

my $module = Test::MockModule->new('My::New'); 
    $module->mock(B => sub($$) 
    { 
     my ($first, $second) = @_; 

     { 
      package My::New::B; 
      My::Calc::C(); 
     } 
    }); 
+0

這不是我的問題的解決方案。也許你打算寫一個包名稱爲'「My :: New」',因爲'「My :: New :: B」'是一個子例程。無論哪種方式,在你的建議中'My :: Calc :: C()'在一個匿名函數中被調用,並且,正如預期的那樣,My :: Calc :: C()'的調用者沒有被正確地確定。 –