xUnit Abstract Test Class с виртуальными методами тестирования с параметрами - PullRequest
4 голосов
/ 05 марта 2019

Я только начал с модульного тестирования и использую фреймворк xUnit.У меня есть класс AbstractTest, который определяет некоторые абстрактные тестовые методы, которые я буду использовать в каждом тестовом классе. Проблема в статическом поле - InsertData .MemberData в этом случае InsertData должен быть статическим.Я не могу присвоить какое-либо значение InsertData в унаследованном классе (TestClass), потому что я получил ошибку до того, как отладчик коснулся обоих конструкторов.

public abstract class AbstractTest<TModel> where TModel : class
{
   public IRepository<TModel> repo;
   public static IEnumerable<object[]> InsertData;

   [Theory]
   [MemberData(nameof(InsertData))]
   public virtual void AbsTestInsert(TModel model)
   {
       try
       {
           repo.AddUpdate(model);
           Assert.True(true);
       }
       catch (Exception ex)
       {
           Assert.True(false, ex.Message);
       }
   }
}

public class TestClass : AbstractTest<TestModel>
{
    public TestClass()
    {
        repo = TestRepository();
    }
}

Поскольку я наследую класс AbstractTest, у меня будет тест.Test class

Я не могу найти решение, чтобы InsertData оставалась статичной, но переопределить ее значение в унаследованном классе.

У меня есть идея с чем-то вроде этого:

public static IEnumerable<object[]> InsertData() => Data;
public abstract/virtual IEnumerable<object[]> Data()
{
    return ...;
}

Но для этого данные также должны быть статичными ...

1 Ответ

3 голосов
/ 06 марта 2019

Требование получения теоретических данных из статического источника является жестким требованием без обходного пути.Однако не требуется, чтобы данные определялись в абстрактном классе вообще.Вы можете сделать это:

public abstract class AbstractTest<TModel> where TModel : class
{
   public IRepository<TModel> repo;

   [Theory]
   [MemberData("InsertData")]
   public virtual void AbsTestInsert(TModel model)
   {
       try
       {
           repo.AddUpdate(model);
           Assert.True(true);
       }
       catch (Exception ex)
       {
           Assert.True(false, ex.Message);
       }
   }
}

public class TestClass : AbstractTest<TestModel>
{
    public static IEnumerable<object[]> InsertData;

    public TestClass()
    {
        repo = TestRepository();
    }
}

Вы определяете данные, используя одно и то же имя для каждого реализующего класса.Это не виртуально / абстрактно, это просто выстраивает вещи по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...