Могу ли я создать общую процедуру установки для всех приборов в пространстве имен в dunitx?

Можно ли использовать пространства имен в dunitx таким образом, чтобы все тестовые приборы в пространстве имен были заключены в одну пару процедур установки / разрыва? (Аналогично атрибуту SetupFixture в nunit, http://www.nunit.org/index.php?p=setupFixture&r=2.5.5).

Я попытался использовать следующие имена модулей / пространства имен:

  • Tests.MyFixture.pas для класса TMyFixtureInitializer с общими методами установки и разрыва

  • Tests.MyFixture.MyTestUnit1.pas и Tests.MyFixture.MyTestUnit2.pas для реальных тестовых классов.

Я столкнулся со следующими проблемами:

  • TMyFixtureInitializer.SetupFixture и TeardownFixture не выполняются, когда сам класс не содержит никакой процедуры тестирования.

  • После добавления фиктивного теста в TMyFixtureInitializer вызываются процедуры SetupFixture и TeardownFixture, но после тестов в Tests.MyFixture.MyTestUnit1 и Tests.MyFixture.MyTestUnit2.

  • Когда я устанавливаю атрибут SetupFixture в конструкторе и атрибут TeardownFixture в деструкторе TMyFixtureInitializer, они выполняются до и после всех тестов, полностью игнорируя пространства имен.

Tests.MyFixture.pas:

unit Tests.MyFixture;

interface
uses
  DUnitX.TestFramework;

type

  [TestFixture]
  TMyFixtureInitializer = class(TObject)
  public

    [SetupFixture]
    procedure SetupMyFixture;
    [TeardownFixture]
    procedure TeardownMyFixture;
  end;

implementation


{ TMyFixtureInitializer }

procedure TMyFixtureInitializer.SetupMyFixture;
begin
  Self.Log('initialize a lot of stuff ...');
end;

procedure TMyFixtureInitializer.TeardownMyFixture;
begin
  Self.Log('cleanup a lot of stuff ...');
end;

initialization
  TDUnitX.RegisterTestFixture(TMyFixtureInitializer);
end.

Tests.MyFixture.MyTestUnit1.pas:

unit Tests.MyFixture.MyTestUnit1;

interface
uses
  DUnitX.TestFramework;

type
  [TestFixture]
  TestClass1 = class(TObject) 
  public
    [Test]
    procedure Test;
  end;

implementation


{ TestClass1 }

procedure TestClass1.Test;
begin
end;

initialization
  TDUnitX.RegisterTestFixture(TestClass1);
end.

(Источник Tests.MyFixture.MyTestUnit2.pas аналогичен).

У кого-нибудь есть пример использования пространств имен для организации инициализации и очистки?

1 ответ

Имхо, нет смысла определять [TestFixture] без каких-либо тестов... И: насколько я знаю, в DUnitX нет поддержки пространств имен. DUnitX просто запускает все приборы (и тесты) в цикле.

Если вам нужны только методы, которые выполняются до всех тестов / после всех тестов, вы можете просто сделать следующее (вместо этого):

Tests.MyFixture.pas:

unit Tests.MyFixture;

interface
// uses
  //DUnitX.TestFramework;

type

  TMyFixtureInitializer = class(TObject)
  public

    class procedure SetupMyFixture;
    class procedure TeardownMyFixture;
  end;

implementation

{ TMyFixtureInitializer }

class procedure TMyFixtureInitializer.SetupMyFixture;
begin
  //Self.Log('initialize a lot of stuff ...');
end;

class procedure TMyFixtureInitializer.TeardownMyFixture;
begin
  //Self.Log('cleanup a lot of stuff ...');
end;

initialization
  TMyFixtureInitializer.SetupMyFixture;
finalization
  TMyFixtureInitializer.TeardownMyFixture;
end.

Но, возможно, это решение слишком просто для вашей проблемы... Я думаю, вы хотите иметь более одного пространства имен... чтобы сгруппировать их. Извините, понятия не имею для этого.

Другие вопросы по тегам