我开始使用Delphi-Mocks框架,并且在模拟构造函数中具有参数的类时遇到问题.TMock的类功能"Create"不允许参数.如果尝试创建TFoo.Create的模拟实例(Bar:someType); 当TObjectProxy.Create时,我得到参数计数不匹配; 试图调用T的'Create'方法.
显然这是因为以下代码没有将任何参数传递给"Invoke"方法:
instance := ctor.Invoke(rType.AsInstance.MetaclassType, []);
Run Code Online (Sandbox Code Playgroud)
我创建了一个重载的类函数,它传递参数:
class function Create( Args: array of TValue ): TMock<T>; overload;static;
Run Code Online (Sandbox Code Playgroud)
并且正在进行我所做的有限测试.
我的问题是:
这是一个错误还是我做错了?
谢谢
PS:我知道Delphi-Mocks是以接口为中心的,但它确实支持类,我正在研究的代码库是99%的类.
我刚开始使用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值并且给出了编译错误
问题:
这是我的代码:
///// 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; …Run Code Online (Sandbox Code Playgroud) 我正在使用 spring4d、dunitx 和 delphi-mocks 编写我的第一个单元测试。(spring4d 版本 1.1 - 2014 年 9 月 12 日)
在我的测试应用程序中,我将一个接口自动连接到我的被测系统类 (sut):
IMyInterface = interface [{yes, a GUID here}]
function GetSomething1: TSomething1;
function GetSomething2: TSomething2;
end;
TMyClass = class
private
[Inject]
FMyInterface: IMyInterface;
// ...
end;
Run Code Online (Sandbox Code Playgroud)
现在,当我使用带有模拟的单元测试时,我使用以下(非常简单的)代码:
TMyTest = class
private
[Test]
procedure Test1;
[Test]
procedure Test2;
// ...
end;
procedure TMyTest.Test1;
var
aSut: TMyClass;
aIntfMock: TMock<IMyInterface>;
aSomething1: TSomething1;
begin
// Arrange
GlobalContainer.RegisterType<TMyClass>;
aIntfMock := TMock<IMyInterface>.Create;
try
GlobalContainer.RegisterType<IMyInterface>.DelegateTo(
function: IMyInterface
begin
Result := aIntfMock;
end)
.AsDefault; …Run Code Online (Sandbox Code Playgroud)