モックオブジェクトのPerlチートシート

豊かなロシア語では、残念ながらいくつかの単語がありません。そのため、「Writing / Writing unit tests」という単語でメモを開始する代わりに、フレーズを長くする必要があります。

単体テストを作成するプロセスでは、古いテストを調べて1つまたは別のオブジェクトを置き換える方法をすばやく覚える必要があることが多いので、小さなチートシートをスケッチするときだと判断しました。

すぐにあまり蹴らないようにお願いします。これはチートシートであり、ガイドではないため、すべてが非常に簡単です。



乱数ジェネレーターの置換





BEGIN { *CORE::GLOBAL::rand = sub {66}; }
      
      







時間変更





 use Test::MockTime qw( :all ); set_fixed_time( 1305636470 ); # do something restore_time();
      
      







CPAN: テスト:: MockTime



なりすましredis





 use Test::Mock::Redis; my $redis = Test::Mock::Redis->new( server => 'whatever' );
      
      







CPAN: テスト::モック:: Redis



DBMSのなりすまし





挿入:

 use DBI; my $dbh = DBI->connect( 'dbi:Mock:', '', '' ); my $history = $dbh->{mock_all_history}; my $st = $history->[0]; # do that execute sql query # check is( $st->statement, $expected_sql, 'Query must be correct' ); is( $st->bound_params()->[0], 123456, 'Bound parameter must be correct' );
      
      





選択するには、偽の結果をスリップする必要があります。

 $dbh->{mock_add_resultset} = { sql => 'SELECT emergency_dequeue_start()', results => [ [ 'emergency_dequeue_start' ], [ '11' ], ], };
      
      





データベースで直接動作するモジュールのみをテストする必要がありますが、他の場合では、これらのテストはモジュールの実装に強く結び付けられており、APIのみにバインドする方がよいため、ORMモジュールまたはそれを置換するモジュールを置き換える方が適切です。



CPAN: DBD ::モック



HTTPスクリプトへのアクセスの置き換え(LWP :: UserAgent)





 use Test::Mock::LWP; $Mock_ua->mock( agent => sub {'My Agent 007'} ); $Mock_request->mock( content_type => sub {'application/x-www-form-urlencoded'} ); $Mock_response->mock( code => sub {200} ); $Mock_response->mock( content => sub {$response} ); $Mock_response->mock( is_error => sub {0} ); $Mock_response->mock( status_line => sub {'status line'} );
      
      





$応答変数の値を設定することにより、「スクリプト」の応答を制御します。 content()を使用し、リクエストが正しく形成されているかどうかを確認したい場合は、次を実行します。

 $Mock_ua->mock( agent => sub { 'SMSOnline plc' } ); $Mock_request->mock( content_type => sub { 'application/x-www-form-urlencoded' } ); $Mock_request->mock( content => sub { ( my $self, $got_request ) = @_; $got_request; } ); $Mock_response->mock( code => sub { 200 } ); $Mock_response->mock( content => sub { $response } ); $Mock_response->mock( is_error => sub { 0 } ); $Mock_response->mock( status_line => sub { 'status line' } );
      
      





$ got_requestで送信したい内容を正確に確認できます



CPAN: テスト::モック:: LWP



任意のオブジェクトの置換





 my $mock = Test::MockObject->new(); Test::MockObject->fake_new( 'My::Module' ); my @txt_stat = (0, 0); $mock->mock( 'read_txt', sub { return @txt_stat; } ); $mock->mock( 'write_txt', sub { 1; } );
      
      





@txt_statでは、さまざまなテスト用に何かを変更できます



CPAN: テスト:: MockObject



Log4perlのなりすまし





debug()メソッドの置換:

 my $logger = Test::MockObject->new(); Test::MockObject->fake_new( 'Log::Log4perl::init' ); $logger->mock( 'debug', sub { shift; diag shift; } );
      
      





テストが正常に合格した場合、診断シフト。 出力が乱雑にならないように削除することができます(オーバーロードして返すことができます)、同様に、他のメソッドをモックすることができます



参照資料



テストについて:: MockObject

DBDについて::モック

mrricoが提案したリンク



All Articles