Как вернуть объект из Mock's willReturn - PullRequest
0 голосов
/ 25 апреля 2020

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;

Первый тест пройден, а второй, конечно, не пройден; Как я могу заставить это работать? Как вы возвращаете объекты из макета с возвращаемым значением объекта

...