Tôi vừa mới bắt đầu sử dụng Delphi-Mocks với các bài kiểm tra dunit của tôi nhưng nó có ít hoặc không có tài liệu.Delphi Mocks - Có thể sử dụng sắp xếp ‘VAR’ hoặc ‘OUT’ trong một chức năng được mô phỏng bằng ‘WillReturn’ không?
Vấn đề là:
Tôi cố gắng để viết một bài kiểm tra 'Test_LogonUser_CheckPwd_GOOD_PASSWORD'
Nhưng tôi không chắc chắn làm thế nào để thử ra chức năng Fusers.CheckPwd (TEST_USERID, TEST_PASSWORD, ERROR_CODE);
Thông thường tôi sẽ sử dụng: Fusers.Setup.WillReturn (True) .When.CheckPwd (TEST_USERID, TEST_PASSWORD, ERROR_CODE);
Nhưng ‘ERROR_CODE’ là một giá trị OUT và đưa ra một lỗi biên dịch
CÂU HỎI:
- Có cách nào để làm cho công việc ‘WillReturn’ với OUT hoặc VAR thông số?
- Có cách nào khác để giả lập ‘CheckPwd’ để nó xem xét thông số OUT hoặc VAR không?
Đây là mã của tôi:
///// 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;
Thay đổi giao diện của bạn vì một hạn chế của bên thứ ba (mà thực tế là giới hạn RTA RTL của Delphi)? Có rất nhiều trường hợp tham số 'var' và' out' là giải pháp tốt nhất cho định nghĩa phương thức. Hoặc bạn có thể phải sử dụng một lớp hoặc bản ghi là loại kết quả "tupple" ... Tôi không tin rằng nó là "pascalish" hơn. –