簡體   English   中英

DUnit無法創建表單。目前沒有MDI表單處於活動狀態

[英]DUnit Cannot create form. No MDI forms are currently active

嘿,我在Delphi XE3中的單元測試有問題我有一個項目,包括1個MDIForm和分配MDIChild表單然后問題是,當我在我的MDIChild表單上運行測試時,我收到此錯誤:

TestAllDataSrouces: EInvalidOperation
at  $0064346F
SetUp FAILED: Cannot create form. No MDI forms are currently active

我的安裝方法如下所示:

procedure TestTCustomerCard.SetUp;
begin
  FCustomerCard :=  TCustomerCard.Create(Application);
end;

我該怎么做才能解決這個錯誤? 到目前為止我試過:

FCustomerCard :=  TCustomerCard.Create(Application.MainForm);

FCustomerCard :=  TCustomerCard.Create(nil);

procedure TestTCustomerCard.SetUp;
var
  a : TForm;
begin
  a := TForm.Create(nil);
  a.FormStyle := fsMDIForm;
  FCustomerCard :=  TCustomerCard.Create(a);
end;

我的測試是:

procedure TestTCustomerCard.TestAllDataSrouces;
var
  I: Integer;
begin
  for I := 0 to FCustomerCard.ComponentCount-1 do
  begin
    if (FCustomerCard.Components[i] is TcxLookupComboBox) then
    begin
      Check(TcxLookupComboBox(FCustomerCard.Components[i]).Properties.ListSource = nil,'Error no ListSource, Lookup: '+TcxLookupComboBox(FCustomerCard.Components[i]).Name+' Parent: '+TcxLookupComboBox(FCustomerCard.Components[i]).Parent.Name);
    end;
    if (FCustomerCard.Components[i] is TcxDBTextEdit) then
    begin
      Check(TcxDBTextEdit(FCustomerCard.Components[i]).DataBinding.DataSource = nil,'Error No DataSet, Text Edit: '+TcxDBTextEdit(FCustomerCard.Components[i]).Name+' Parent: '+TcxDBTextEdit(FCustomerCard.Components[i]).Parent.Name);
    end;
    if (FCustomerCard.Components[i] is TcxGridDBTableView) then
    begin
      Check(TcxGridDBTableView(FCustomerCard.Components[i]).DataController.DataSource = nil,'Error no Data Source, DB Grid View: '+TcxGridDBTableView(FCustomerCard.Components[i]).Name);
    end;
  end;
end;

演示項目: 這里

您正在做的更像是功能測試或集成測試。 您正在檢查您的UI是否已正確設置。 這種測試不同於單元測試。

單元測試應該檢查如果給模塊某些輸入,那么它們會產生某些輸出。 單元測試已本地化。 它們旨在獨立於其他單元測試單元的行為。 UI特別依賴於其他單位。 它們從輸入設備獲取數據並在數據庫上操作,並且總體上具有相當復雜的依賴性集。 這使它們成為單元測試的糟糕目標。

看看這個問題 - 單元測試與功能測試

要進行所需的測試,最好自己制作可以正確設置環境並執行測試的工具。

錯誤消息指出了問題。 如果您需要MDI子表單,則必須具有MDI父表單。 並且該父表單必須是您程序的主要形式。 很難在DUnit項目中實現。 您的解決方案似乎是:

  • 使程序的主要形式成為MDI主表單。 我認為實現這一目標會很棘手。
  • 使您的受測試表格不是MDI子表單。
  • 找到一種測試方法,不需要實例化此表單。

我遇到了同樣的問題,我決定實施David Heffernan的建議和“讓你的形式受到測試,而不是MDI子形式”。

在這里,我將描述如何實現這一目標。 我已在我的測試用例單元中進行了所有更改。

  1. 制作繼承原始MDI子表單的測試表單

    type TTestCustomerCard = class(TCustomerCard) end;

    在測試用例類之前添加它。

  2. 將dfm文件或表單(例如CustomerCard.dfm)復制到TestCustomerCard.dfm

  3. 在任何文本編輯器中打開TestCustomerCard.dfm,刪除行

    FormStyle = fsMDIChild因為fsNormal是默認值 ),

    更改第一行object CustomerCard: TCustomerCard

    object TestCustomerCard: TTestCustomerCard

  4. 添加指令{$R TestCustomerCard.dfm }

  5. 在你的SetUp方法而不是

    FCustomerCard := TCustomerCard.Create(Application);

    FCustomerCard := TTestCustomerCard.CreateNew(Application); InitComponentRes( 'TTESTCUSTOMERCARD', FCustomerCard );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM