gpt4 book ai didi

Delphi Mocks – 是否可以在使用 ‘VAR’ 模拟的函数中使用 ‘OUT’ 或 ‘WillReturn’ 排列?

转载 作者:行者123 更新时间:2023-12-03 15:06:47 24 4
gpt4 key购买 nike

我刚刚开始使用Delphi-Mocks与我的 dunit 测试一起使用,但它几乎没有文档。

问题是:

我正在尝试编写一个测试'Test_LogonUser_CheckPwd_GOOD_PASSWORD'

但我不知道如何模拟该函数 Fusers.CheckPwd(TEST_USERID,TEST_PASSWORD, ERROR_CODE);

通常我会使用: Fusers.Setup.WillReturn(True).When.CheckPwd(TEST_USERID,TEST_PASSWORD, ERROR_CODE);

但是“ERROR_CODE”是一个 OUT 值并给出编译错误

问题:

  1. 有没有办法让“WillReturn”与 OUT 或 VAR 参数一起使用?
  2. 是否有不同的方法来模拟“CheckPwd”,以便它查看 OUT 或 VAR 参数?

这是我的代码:

/////  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;

最佳答案

据我所知,这是 Delphi 模拟所依赖的 TVirtualInterface 标准类实现的限制。这是“新 RTTI”的弱点/限制之一。

唯一可能的解决方案是使用不使用此 TVirtualInterface 类的 stub /模拟库。

我所知道的唯一拥有自己的“虚拟类”工厂的库是 our Open Source mORMot framework (对于 Delphi 6 到 XE4,在 Win32 和 Win64 下)。它支持 varout 值参数。要测试任何输出参数值,您可以使用 ExpectsTrace() 方法 - 感谢伟大的 "Call Tracing" feature of mORMot .

关于Delphi Mocks – 是否可以在使用 ‘VAR’ 模拟的函数中使用 ‘OUT’ 或 ‘WillReturn’ 排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18272646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com