NUnit 3 dynamici c ValueSourceAttribute - PullRequest
       49

NUnit 3 dynamici c ValueSourceAttribute

0 голосов
/ 13 января 2020

Мне нужно преобразовать тесты NUnit 2.x в тесты NUnit 3.x, и в настоящее время существует ситуация, когда существует один базовый класс с тестами и свойством abstract IEnumerable, используемым в ValueSource для этих тестов и много классы, которые наследуют этот базовый класс и переопределяют это свойство.
Вопрос в том, как преобразовать эти тесты в NUnit 3.x, где ValueSource должно быть указано c. У каждого базового ребенка также есть разные TestCategory.Subcategory.

[Category(TestCategory.Transformations)]
public abstract class Transformations
{
    [Test]
    public void TransformTest([ValueSource("TestDataSource")] TransformTestSource source)
    {
        // some test logic
    }

    protected abstract IEnumerable<TransformTestSource> TestDataSource { get; }
}

[TestFixture]
[Category(TestCategory.Transformations)]
[Category(TestCategory.Subcategory.Example1)]
public class ChildExample1
{
    protected override IEnumerable<TransformTestSource> TestDataSource
    {
        get { /* get data for example from database, or file */ }
    }
}

Единственный способ на мой взгляд - удалить определение абстрактного свойства из абстрактного класса и определить это свойство в каждом дочернем классе, но это звучит ужасно. Есть ли лучший способ?

РЕДАКТИРОВАТЬ: Иногда в дочернем классе также есть некоторые другие тесты, поэтому эти классы существуют не всегда только для заполнения данных.

1 Ответ

1 голос
/ 13 января 2020

Базовый класс должен быть абстрактным, иначе NUnit создаст его экземпляр и запустит содержащиеся в нем тесты. Конечно, он также повторно запустит те же тесты, когда создаст экземпляр базового класса. В лучшем случае это сбивает с толку, а в худшем случае выдает ошибки, когда тесты выполняются только на базовом классе.

Вы используете термин dynamici c в вопросе без объяснения причин. Если вы имеете в виду метод или свойство instance , то этот ответ для вас. Конечно, противоположность метода stati c является методом экземпляра в C#, а «dynamici c» - это нечто иное. В любом случае, если вы имеете в виду что-то другое, отредактируйте свой вопрос, чтобы объяснить.

Итак ... в то время как NUnit 3 требует, чтобы ваш источник был stati c, это не ограничивает вас только использованием вещи, которые известны во время компиляции. Если ваш источник - это метод * stati c , а не поле, то вы можете найти необходимую информацию для динамического генерирования данных (в некотором смысле).

В NUnit 3 также возможно использовать TestCaseSource для хранения ваших данных. В этом случае форма 3 конструктора атрибута (см. Документы) разрешает использование члена экземпляра. Однако эта форма помещает ваши данные в отдельный класс от ваших тестов и может не подходить для вашего использования.

...