2014-10-28 22 views
1

我有以下場景,我需要模擬具有多個包的模塊中的子例程。模擬具有多個包的Perl模塊

我的模塊(moddemo.pm)

package A; 

sub helloa 
{ 
    print "Hello, Im in demomod module of package A\n"; 
    return 1; 
} 

package B; 

sub hellob 
{ 
print "Hello, Im in demomod module of package B\n"; 
return 1; 
} 

1; 

我需要模擬A :: helloa(),B :: hellob()子程序。這是我嘗試過的代碼,但失敗了。

#!/usr/bin/perl 
use Test::MockModule; 
use moddemo; 

{ 
my $mockobj = new Test::MockModule('moddemo'); 
$mockobj->mock('A::helloa', sub { print "This is mocked object calling helloa function\n"; }); 
$mockobj->mock('B::hellob', sub { print "This is mocked object calling hellob function\n";}); 
modobj::A::helloa(); 
modobj::B::hellob(); 
} 

任何幫助如何模擬這些子程序?提前致謝。

回答

1

我已經通過重新定義子例程來完成它。

注:

  • 的重新定義會導致一個警告,所以需要no warnings線擺脫這一點。
  • 重新定義在本地應用,所以您應該看到只有塊內的子例程調用已更改。
+0

非常感謝。這工作很好!但是當模塊有多個包時,這個方法是否會被嘲笑? – Abhinay 2014-10-29 06:51:58

+0

我是這樣做的,因爲使用Test :: MockModule執行它不適用於與.pm文件命名不同的軟件包。我想你可以認爲這是一個更手動的方式。在這種情況下,更適合你的另一個模塊是https://metacpan.org/pod/Sub::Override。 – stevenl 2014-11-03 00:45:54

0

我可能是錯的,但從我在module source中看到的情況來看,似乎不可能以您嘗試的方式使用它。 MockModule首先需要require s所需的包(.pm文件),然後只允許來自該包的子例程,即名稱中不允許有::

據我瞭解,可以通過這種方式測試模塊一起使用(修改代碼以適應其預期):

moddemo.pm

package moddemo; 
use strict; 
use warnings; 

sub helloa 
{ 
     print "moddemo::helloa\n"; 
     return 1; 
} 

sub hellob 
{ 
     print "moddemo::hellob\n"; 
     return 1; 
} 

1; 

現在的測試文件,test.pl

use strict; 
use warnings; 

use Test::MockModule; 
use moddemo; 

{ 
     my $mockobj = new Test::MockModule('moddemo'); 
     $mockobj->mock('helloa', sub { print "This is mocked object calling helloa function\n"; }); 
     $mockobj->mock('hellob', sub { print "This is mocked object calling hellob function\n";}); 

     # mocked versions 
     moddemo::helloa(); 
     moddemo::hellob(); 
} 

# now original versions 
moddemo::helloa(); 
moddemo::hellob(); 

最後輸出如預期:

This is mocked object calling helloa function 
This is mocked object calling hellob function 
moddemo::helloa 
moddemo::hellob 
+0

感謝您的回答。是的,我以前嘗試過,它完美地工作。但問題是模塊有多個包時。除了Test :: MockModule之外是否還有Perl模塊,符合我的期望? – Abhinay 2014-10-29 06:25:28

+0

不知道任何CPAN模塊(當然,它可能存在,但我不能命名一個),但你至少可以看看Test :: MockModule實現(它在'sub mock'中保存原始子例程實現的地方,以及代替'sub_replace_sub'中代碼的代碼),並使用相同的typeglob技術手動創建模擬對象。在'perlmod(1)'中描述了Typeglobs('* name')。 – afenster 2014-10-29 10:41:54