perl – DBD :: Mock指定存储过程的输出值
发布时间:2020-12-16 06:13:17 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用 DBD::Mock来测试使用数据库的代码.到目前为止,正常的SQL查询工作得很好,但是我对如何测试调用存储过程的代码感到有些不知所措.使用DBD :: Mock :: Session-新构造函数的bound_params键,我可以指定输入参数,但我似乎找不到设置使用DBI ::绑定
我正在尝试使用
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 = $arg2n"; 现在,我想为arg2参数的’frobnication’播种数据库,这样当执行上面的代码时,$arg2变量包含这个字符串,输出是
解决方法
这就是我最终做的事情.本质上,主要工作是覆盖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/BEGINns*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 = $arg2n"; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |