Delphi 10.3.3 Windows 10
Я пытаюсь проверить этот метод:
unit View.BonusTypes;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Viewmodel.BonusTypes;
type
TfrmBonusTypes = class(TForm)
dsBonusTypes: TDataSource;
private
FViewModel : IViewModelBonusTypes;
public
procedure SetViewModel(AViewModel : IViewModelBonusTypes);
property ViewModel : IViewModelBonusTypes read FViewModel;
end;
var
frmBonusTypes: TfrmBonusTypes;
implementation
{$R *.dfm}
procedure TfrmBonusTypes.SetViewModel(AViewModel: IViewModelBonusTypes);
begin
FViewModel := AViewModel;
dsBonusTypes.DataSet := FViewModel.GetBonusTypesDataSet;
end;
end.
У меня есть этот интерфейс:
unit ViewModel.BonusTypes;
interface
{$M+}
Uses
Data.DB;
type
IViewModelBonusTypes = Interface
['{05F95203-8BDA-4620-A88D-1F991EAEC089}']
function GetBonusTypesDataSet: TDataSet;
end;
implementation
end.
с этими 2 тестами:
unit View.BonusTypes.Tests;
interface
{$M+}
uses
DUnitX.TestFramework,
View.BonusTypes,
ViewModel.BonusTypes,
Data.DB,
Delphi.Mocks;
type
[TestFixture]
ViewBonusTypesTests = class(TObject)
private
CUT : TfrmBonusTypes;
public
[Setup]
procedure Setup;
[TearDown]
procedure TearDown;
[Test]
procedure SetViewModel_WhenCalled_SetsViewModel;
[Test]
procedure SetViewModel_WhenCalled_SetsDataSourceDataSet;
end;
implementation
procedure ViewBonusTypesTests.Setup;
begin
CUT := TfrmBonusTypes.Create(nil);
end;
procedure ViewBonusTypesTests.SetViewModel_WhenCalled_SetsDataSourceDataSet;
var
MockViewModel: TMock<IViewModelBonusTypes>;
LDataSet: TDataSet;
begin
// Arrange
LDataSet := TDataSet.Create(nil);
try
MockViewModel := TMock<IViewModelBonusTypes>.Create;
MockViewModel.Setup.WillReturn(LDataSet).When.GetBonusTypesDataSet;
// Act
CUT.SetViewModel(MockViewModel);
// Assert
Assert.IsNotNull(CUT.dsBonusTypes.DataSet);
finally
LDataSet.Free;
end;
end;
procedure ViewBonusTypesTests.SetViewModel_WhenCalled_SetsViewModel;
var
MockViewModel: TMock<IViewModelBonusTypes>;
LDataSet: TDataSet;
begin
// Arrange
LDataSet := TDataSet.Create(nil);
try
MockViewModel := TMock<IViewModelBonusTypes>.Create;
MockViewModel.Setup.WillReturn(LDataSet).When.GetBonusTypesDataSet;
// Act
CUT.SetViewModel(MockViewModel);
// Assert
Assert.IsNotNull(CUT.ViewModel);
finally
LDataSet.Free;
end;
end;
procedure ViewBonusTypesTests.TearDown;
begin
CUT.Free;
end;
initialization
TDUnitX.RegisterTestFixture(ViewBonusTypesTests);
end.
Я получаю EAbstractError. Если я закомментирую задание
procedure TfrmBonusTypes.SetViewModel(AViewModel: IViewModelBonusTypes);
begin
FViewModel := AViewModel;
// dsBonusTypes.DataSet := FViewModel.GetBonusTypesDataSet;
end;
Первый тест пройден, а второй, конечно, не пройден; Как я могу заставить это работать? Как вы возвращаете объекты из макета с возвращаемым значением объекта