Конструкторы тестовых классов не выполняются при индивидуальном запуске xUnit Theory?

Пример кода игрушки:

public abstract class testBase
{
  public testBase()
  {
    //Some common test setup code, which will initialize ManagerClass
  }
}

public class someTests: testBase
{
  public someTests()
  {
    //someTests-specific constructor code.
  }

  [Theory]
  [PropertyData("MyTestData")]
  public void test1(Foo foo)
  {
    //Use foo to do a test
  }

  public static IEnumerable<object[]> MyTestData
  {
    get
    {
      yield return new object[] { ManagerClass.CreateANewFoo(1) };
      yield return new object[] { ManagerClass.CreateANewFoo(42) };
    }
  }
}

В приведенном выше примере, если я специально запускаю test1 (я использую Resharper, но проблема также возникает, когда я использую графический интерфейс xUnit), мой тест завершается ошибкой, потому что кажется, что ни конструкторы testBase, ни конструкторы someTests не выполняются. Следовательно, вызов ManagerClass.CreateANewFoo() выдает NullReference.

Если я запускаю все тесты в someTests или любой другой отдельный тест, конструктор выполняется, как и ожидалось, и тесты продолжаются ожидаемым образом. Единственное, что отличает test1 от других, это то, что он использует атрибут PropertyData.

Любые идеи, почему это происходит/что я делаю неправильно?


person BenA    schedule 12.08.2009    source источник
comment
Отказ от ответственности: не используйте xUnit.net. Вы пытались поместить операторы Console.WriteLine/trace в ctors? Вы уверены, что ctor не вызывается... потому что я не понимаю, как он может запустить тест без создания экземпляра тестового прибора/класса. Звучит как ошибка для меня, если Run All Tests / Run One Test приводит к другому результату теста. Попробуйте: если попадают ctors, попробуйте использовать поддельные значения вместо возврата статического метода? Выполняются ли тесты в разных доменах приложений в xUnit.net?   -  person Gishu    schedule 14.08.2009
comment
Включение операторов Console.WriteLine показывает, какие конструкторы выполняются, когда тест запускается как часть всего класса. Но при индивидуальной отладке (с точкой останова в операторах Writeline) первое, с чем я сталкиваюсь в отладчике, это выбрасываемая NullReference, а не точки останова.   -  person BenA    schedule 14.08.2009
comment
Это может быть связано с тем, что ваш статический метод MyTestData по какой-то причине вызывается до запуска теста, поскольку вам не нужно создавать объект для вызова статического метода. Этот дизайн тестового приспособления немного смущает меня - статический метод зависит от ctor базового класса для правильной работы. Может ли метод PropertyData быть методом экземпляра — попробуйте временно переместить код установки из ctor базового класса в статический метод, чтобы убедиться, что это является причиной.   -  person Gishu    schedule 14.08.2009


Ответы (1)


Мы попытались воспроизвести это с помощью xUnit.net 1.5 Beta и не смогли.

person Brad Wilson    schedule 15.08.2009
comment
После дальнейшего обсуждения CodePlex (xunit.codeplex.com/Thread/View.aspx? ThreadId=65564), мне просто нужно провести рефакторинг теста с учетом порядка выполнения. - person BenA; 17.08.2009