perl – DBD :: Mock指定存储过程的输出值

前端之家收集整理的这篇文章主要介绍了perl – DBD :: Mock指定存储过程的输出值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用 DBD::Mock来测试使用数据库代码.到目前为止,正常的SQL查询工作得很好,但是我对如何测试调用存储过程的代码感到有些不知所措.使用DBD :: Mock :: Session->新构造函数的bound_params键,我可以指定输入参数,但我似乎找不到设置使用DBI ::绑定的参数的模拟结果的方法StatementHandle :: bind_param_inout().

要提供将要测试的代码的示例,请查看以下内容

use DBI;
my $dbh = DBI->connect('dbi:Mock','',{ RaiseError => 1,PrintError => 1 });
my $sth = $dbh->prepare(q{
BEGIN
  some_stored_proc(i_arg1 => :arg1,o_arg2 => :arg2);
END;
});
my ($arg1,$arg2) = ('foo','bar');
$sth->bind_param(':arg1',$arg1);
$sth->bind_param_inout(':arg2',\$arg2,200);
$sth->execute();
print STDERR "OUTPUT VALUE OF arg2 = $arg2\n";

现在,我想为arg2参数的’frobnication’播种数据库,这样当执行上面的代码时,$arg2变量包含这个字符串,输出

OUTPUTVALUE OF arg2 = frobnication

解决方法

这就是我最终做的事情.本质上,主要工作是覆盖DBD :: Mock :: st :: bind_param_inout方法.

use DBI;
use DBD::Mock;
use DBD::Mock::st;
use Carp;

# array of values to be bound on each invocation
my @values = qw/frobnication/;
# dummy variable to trick DBD::Mock into thinking it got the same reference for
# bind_param_inout and bound_params (the former is usually not in the control of
# the testing code,hence this hack).
my $dummy = undef;
# keep reference to the original bind_param_inout method
my $bind_param_inout_orig = \&DBD::Mock::st::bind_param_inout;
# override with our mocked version that assigns a value to the reference.
# notice that it does so at the bind_param_inout call,*NOT* the execute call!
local *DBD::Mock::st::bind_param_inout = sub {
  my ($self,$param_num,$val,$size) = (shift,shift,shift);
  $bind_param_inout_orig->($self,\$dummy,$size,@_);
  $$val = shift @values or Carp::confess '@values array exhausted!';
};

# set up the mock session
my $dbh = DBI->connect('dbi:Mock:',PrintError => 1 });
$dbh->{mock_session} = DBD::Mock::Session->new('foo_session' => (
  {
    statement => qr/BEGIN\n\s*some_stored_proc/,results => [],bound_params => ['foo',\$dummy]
  }));

# this is the code to be tested

my $sth = $dbh->prepare(q{
BEGIN
  some_stored_proc(i_arg1 => :arg1,200);
$sth->execute();
print STDERR "OUTPUT VALUE OF arg2 = $arg2\n";

猜你在找的Perl相关文章