Delphi Mocks – Is it possible to use ‘VAR’ or ‘OUT’ arrangements in a function that is been mocked with a ‘WillReturn’? -
i have started use delphi-mocks dunit tests has little or no documentation.
the problem is:
i trying write test ‘test_logonuser_checkpwd_good_password’
but not sure how mock out function fusers.checkpwd(test_userid,test_password, error_code);
normally use: fusers.setup.willreturn(true).when.checkpwd(test_userid,test_password, error_code);
but ‘error_code’ out value , gives compile error
questions:
- is there way make ‘willreturn’ work out or var parameters ?
- is there different way mock out ‘checkpwd’ looks @ out or var parameters ?
here code:
///// tdlusers interface type {$m+} idlusers = interface(iinterface) ['{3611b437-888c-4919-b304-238a80dad476}'] function verifypassword(userid: integer; pwd: string): boolean; function checkpwd(userid: integer; pwd: string; out errorcode: integer) : boolean; end; function dl_users : idlusers; {$m-} implementation type tdlusers = class(tdbicontrol,idlusers) public function verifypassword(userid: integer; pwd: string): boolean; function checkpwd(userid: integer; pwd: string; out errorcode: integer; out errormsg:string) : boolean; end; function dl_users : idlusers; begin result := tdlusers.create; end; //// tuserctrl interface uses dlusers; type tuserctrl = class private fusers : idlusers; public function logonuser_checkpwd(userid: integer; pwd: string): boolean; function logonuser_verifypassword(userid: integer; pwd: string): boolean; constructor create; overload; constructor create(fusers : idlusers); overload; { used dependency injection } end; implementation constructor tuserctrl.create; begin create(dl_users); end; constructor tuserctrl.create(fusers : idlusers); begin self.fusers := fusers; end; function tuserctrl.logonuser_verifypassword(userid: integer; pwd: string): boolean; begin result := fusers.verifypassword(userid,pwd); end function tuserctrl.logonuser_checkpwd(userid: integer; pwd: string): boolean; var errorcode : integer; begin result := fusers.checkpwd(userid,pwd,errorcode); // needs done errorcode end; ///// unit tests procedure testtdlusers.setup; begin inherited; fusers := tmock<idlusers>.create; fuserctrl := tuserctrl.create(fusers); end; procedure testtdlusers.test_logonuser_verifypassword_good_password; var answer : boolean; begin fusers.setup.willreturndefault('verifypassword',false); fusers.setup.willreturn(true).when.verifypassword(test_userid,test_password); answer := fuserctrl.logonuser_verifypassword(test_userid,test_password,errorcode,errormsg); checkequals(true,answer); end; procedure testtdlusers.test_logonuser_checkpwd_good_password; var answer : boolean; begin fusers.setup.willreturndefault('checkpwd',false); // major problem line checkpwd has out pramater fusers.setup.willreturn(true).when.checkpwd(test_userid,test_password, error_code); answer := fuserctrl.logonuser_checkpwd(test_userid,test_password,errorcode,errormsg); checkequals(true,answer); end;
afaik limitation of tvirtualinterface standard class implementation, on delphi mocks relies. 1 of weaknesses/limitations of "new rtti".
the possible solution use stubbing/mocking library not use tvirtualinterface class.
the library know has own "virtual class" factory, our open source mormot framework (for delphi 6 xe4, under win32 , win64). supports var , out value parameters. testing out parameter value, can use expectstrace() method - great "call tracing" feature of mormot.
Comments
Post a Comment