Модульный тест CEF4Delphi нет - PullRequest
0 голосов
/ 09 июня 2018

Я тестирую TFrame с компонентом CEF4Delphi , но у меня возникают проблемы с освобождением TForm, содержащего TFrame и соответствующие компоненты CEF4Delphi.

Ниже приводится описаниеМинимальный пример

program MyTFrameExample;
{

  Delphi DUnit Test Project
  -------------------------
  This project contains the DUnit test framework and the GUI/Console test runners.
  Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options
  to use the console test runner.  Otherwise the GUI test runner will be used by
  default.

}

{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
  madExcept,
  madLinkDisAsm,
  madListHardware,
  madListProcesses,
  madListModules,
  DUnitTestRunner,
  Vcl.Forms,
  WinApi.Windows,
  uCEFApplication,
  SSFrame in '..\..\SS\SSFrame.pas' {SSFrm: TFrame},
  TestSSFrame in '..\..\Test\TestSSFrame.pas';

{*.RES}

{$I cef.inc}

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

begin

  GlobalCEFApp := TCefApplication.Create;
  GlobalCEFApp.SingleProcess := True;

  if GlobalCEFApp.StartMainProcess then
  begin
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    DUnitTestRunner.RunRegisteredTests;
    Application.Run;
  end;

  GlobalCEFApp.Free;
end.

unit TestSSFrame;
{

  Delphi DUnit Test Case
  ----------------------
  This unit contains a skeleton test case class generated by the Test Case Wizard.
  Modify the generated code to correctly setup and call the methods from the unit
  being tested.

}

interface

uses
  TestFramework,
  System.SysUtils,
  Vcl.Graphics,
  uCEFChromium,
  Winapi.Windows,
  System.Variants,
  uCEFInterfaces,
  uCEFChromiumWindow,
  Vcl.Dialogs,
  Vcl.Controls,
  uCEFWindowParent,
  Vcl.Forms,
  Winapi.Messages,
  SSFrame,
  System.Classes;

type
  // Test methods for class TSSFrm

  TestTSSFrm = class(TTestCase)
  strict private
    FSSFrm: TSSFrm;
    FMainForm: TForm;
  public
    procedure SetUp; override;
    procedure TearDown; override;
  published
    procedure TestChromium1AfterCreated;
  end;

implementation

procedure TestTSSFrm.SetUp;
begin
  Application.CreateForm(TForm, FMainForm);
  FSSFrm := TSSFrm.Create(FMainForm);
  FSSFrm.Parent := FMainForm;
  FSSFrm.Visible := True;
  FSSFrm.Align := alClient;

  FSSFrm.Chromium1.CreateBrowser(FSSFrm.ChromiumWindow1);
  if not (FSSFrm.ChromiumWindow1.CreateBrowser) then
    FSSFrm.Timer1.Enabled := True;

  while FSSFrm.Chromium1.Initialized = False do
  begin
    Application.ProcessMessages;
  end;

  FMainForm.Show;
end;

procedure TestTSSFrm.TearDown;
begin
  FMainForm.Free;
[enter link description here][1]  FMainForm := nil;
end;

procedure TestTSSFrm.TestChromium1AfterCreated;
var
  a: Boolean;
begin
  if (FMainForm.Components[0] is TSSFrm) then
  begin
    a := (FMainForm.Components[0] as TSSFrm).IsGoogleSearchPageCreated;
    CheckTrue(a);
  end;
end;


initialization
  // Register any test cases with the test runner
  RegisterTest(TestTSSFrm.Suite);

end.

unit SSFrame;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  uCEFWindowParent,
  uCEFChromiumWindow,
  uCEFInterfaces,
  uCEFChromium,
  Vcl.StdCtrls,
  Vcl.ExtCtrls;

type
  TSSFrm = class(TFrame)
    Chromium1: TChromium;
    ChromiumWindow1: TChromiumWindow;
    Timer1: TTimer;
    procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    FIsGoogleSearchPageLoaded: Boolean;
    FIsGoogleSearchPageCreated: Boolean;
  public
    { Public declarations }
    function IsGoogleSearchPageCreated: Boolean;
  end;

implementation

{$R *.dfm}

procedure TSSFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
begin
  FIsGoogleSearchPageLoaded := False;
  FIsGoogleSearchPageCreated := True;
end;

function TSSFrm.IsGoogleSearchPageCreated: Boolean;
begin
  Result := FIsGoogleSearchPageCreated;
end;

procedure TSSFrm.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  if not (ChromiumWindow1.CreateBrowser) and not (ChromiumWindow1.Initialized) then
    Timer1.Enabled := True;
end;

end.

Когда я запускаю TestTSSFrm.TestChromium1AfterCreated;тестовый проход, но когда дело доходит до закрытия тестового приложения, то само приложение не закрывается полностью, и мне приходится сбрасывать его из IDE вручную.Если я закомментирую строки

  FMainForm.Free;
  FMainForm := nil;

, у меня не будет проблем с закрытием тестового приложения, но мне придется закрывать форму вручную.

Где я делаю неправильно?

...