标签: delphi-mocks

Delphi-Mocks:在构造函数中使用参数模拟一个类

我开始使用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 mocking delphi-mocks

10
推荐指数
1
解决办法
1350
查看次数

德尔福模拟 - 是否可以在使用'WillReturn'模拟的函数中使用'VAR'或'OUT'排列?

我刚开始使用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; …
Run Code Online (Sandbox Code Playgroud)

delphi dunit delphi-xe2 delphi-mocks

5
推荐指数
1
解决办法
658
查看次数

spring4d 注销接口类型(spring4d、dunitx、delphi-mocks)

我正在使用 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)

delphi unit-testing spring4d delphi-mocks

5
推荐指数
1
解决办法
483
查看次数