听起来像是一个模拟的用例(我在这里使用术语模拟,因为大多数框架将它们的各种测试替身称为模拟)
在以下示例中,我使用的是 DUnit,但它对 DUnitX 没有任何影响。我也在使用 Spring4D 1.2 的模拟功能(我没有检查 Delphi Mocks 是否支持这个)
unit MyClass;
interface
type
TMyClass = class
private
fCounter: Integer;
protected
procedure MyProcedure; virtual;
public
property Counter: Integer read fCounter;
end;
implementation
procedure TMyClass.MyProcedure;
begin
Inc(fCounter);
end;
end.
program Tests;
uses
TestFramework,
TestInsight.DUnit,
Spring.Mocking,
MyClass in 'MyClass.pas';
type
TMyClass = class(MyClass.TMyClass)
public
// just to make it accessible for the test
procedure MyProcedure; override;
end;
TMyTest = class(TTestCase)
published
procedure Test1;
end;
procedure TMyClass.MyProcedure;
begin
inherited;
end;
procedure TMyTest.Test1;
var
// the mock is getting auto initialized on its first use
// and defaults to TMockBehavior.Dynamic which means it lets all calls happen
m: Mock<TMyClass>;
o: TMyClass;
begin
// set this to true to actually call the "real" method
m.CallBase := True;
// do something with o
o := m;
o.MyProcedure;
// check if the expected call actually did happen
m.Received(Times.Once).MyProcedure;
// to prove that it actually did call the "real" method
CheckEquals(1, o.Counter);
end;
begin
RegisterTest(TMyTest.Suite);
RunRegisteredTests();
end.
请记住,这仅适用于虚拟方法。