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:

  1. is there way make ‘willreturn’ work out or var parameters ?
  2. 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

Popular posts from this blog

assembly - 8086 TASM: Illegal Indexing Mode -

Java, LWJGL, OpenGL 1.1, decoding BufferedImage to Bytebuffer and binding to OpenGL across classes -

javascript - addthis share facebook and google+ url -