Właśnie zacząłem używać Delphi-Mocks z moimi testami dunit, ale ma to małą lub żadną dokumentację.Delphi Mocks - Czy można użyć funkcji "VAR" lub "OUT" w funkcji, która została wyśmiana przez "WillReturn"?
Problem jest:
Próbuję napisać test 'Test_LogonUser_CheckPwd_GOOD_PASSWORD'
Ale nie jestem pewien, jak wyśmiewać się funkcję Fusers.CheckPwd (TEST_USERID, TEST_PASSWORD, ERROR_CODE);
Normalnie używam: Fusers.Setup.WillReturn (True) .When.CheckPwd (TEST_USERID, TEST_PASSWORD, ERROR_CODE);
Ale „ERROR_CODE” jest wartością OUT i daje błąd kompilacji
PYTANIA:
- Czy istnieje sposób, aby uczynić pracę „WillReturn” z parametrami OUT lub VAR?
- Czy istnieje inny sposób na wyodrębnienie "CheckPwd" tak, aby wyglądał na parametry OUT lub VAR?
Oto mój kod:
///// 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 for 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);
// do what needs to be done with 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 with line CheckPwd has an 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;
Zmiana interfejsu powodu ograniczeń trzeciej (która jest w rzeczywistości ograniczeniem RTL Delphi AFAIK)? Istnieje wiele przypadków, w których parametry "var" i "out" są najlepszym rozwiązaniem do definicji metody. Albo może będziesz musiał użyć klasy lub nagrać jako wynik "tupple" ... Nie jestem przekonany, że jest bardziej "pascalish". –