首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在DUnitX和Spring4D 1.2.2中模拟具有var参数的方法调用

如何在DUnitX和Spring4D 1.2.2中模拟具有var参数的方法调用
EN

Stack Overflow用户
提问于 2021-12-14 17:54:51
回答 1查看 190关注 0票数 1

如何模拟像procedure foo( var i_ : integer )这样的接口方法调用。测试方法局部变量作为var param传递,因此测试必须使用Arg.IsAny (测试不访问它)。结果值与var param的out值不相同,因为测试方法在返回结果之前对其进行了一些处理。测试中注释的When变体不编译。当前的值编译,但结果是一个未定义的值(模拟Executes根本不调用,因为var=pointer值不匹配)。如何使用var参数模拟方法调用?

代码语言:javascript
运行
复制
unit Unit1;

interface

uses
    DUnitX.TestFramework
  , Spring.Mocking
  ;

type
  IMyInterface = interface ( IInvokable )
    ['{606BA1D8-EAEC-42CB-A774-911628FD2E6C}']
    procedure foo( var x_ : integer );
  end;

  TMyClass = class
    private
      fMyInterface : IMyInterface;
    public
      constructor Create( myInterface_ : IMyInterface );
      function bar : integer;
  end;

  [TestFixture]
  TMyClassUnitTest = class
    public
      [Test]
      procedure bar;
  end;

implementation

constructor TMyClass.Create( myInterface_ : IMyInterface );
begin
  inherited Create;
  fMyInterface := myInterface_;
end;

function TMyClass.bar : integer;
var
  i : integer;
begin
  fMyInterface.foo( i );
  result := i + 1;
end;

procedure TMyClassUnitTest.bar;
var
  myInterfaceMock : Mock<IMyInterface>;
  myClass : TMyClass;
  i : integer;

  procedure prepareMyInterfaceFooCall( fooVarValue_ : integer );
  var
    ii : integer;
  begin
    ii := 7;
    myInterfaceMock.Setup.Executes(

      function ( const args_ : TCallInfo ) : TValue
      begin
        args_[0] := TValue.From<integer>( fooVarValue_ );
      end

    //).When.foo( Arg.IsAny<integer> );
    //).When.foo( integer( Arg.IsAny<integer> ) );
    ).When.foo( ii );
  end;

begin
  prepareMyInterfaceFooCall( 5 );
  myClass := TMyClass.Create( myInterfaceMock );
  try
    i := myClass.bar;
  finally
    FreeAndNIL( myClass );
  end;
  Assert.AreEqual( 6, i );
end;

end.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-03 15:31:54

1.2.2不能这样做,但2.0可以做到(目前正在开发分支)

下面是对您的代码的相关更改:

代码语言:javascript
运行
复制
procedure prepareMyInterfaceFooCall(expectedValue: Integer);
begin
  myInterfaceMock.Setup.Executes
  // put the wildcard matcher because your code passes a non initialized variable
  // a matcher on the When() always has priority over any individual parameter matching
  .When(Args.Any)
  // use the Arg.Ref syntax specifying the return value
  .foo(Arg.Ref<Integer>(expectedValue).Return);
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70353474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档