Как я могу создать базовый базовый тест с NUnit, от которого я могу наследовать и иметь тесты из базового прогона?

Так что в основном у меня есть объект домена и универсальный репозиторий, который может выполнять операции CRUD с этим объектом.

public interface IBaseRepository<T> where T : BaseEntity
{
    void Add(T entity);
    void Remove(T entity);
    T ById(int id);
    IEnumerable<T> All();
}

Поэтому у меня есть несколько реализаций этого интерфейса, по одной для каждого объекта домена.

Я хотел бы написать несколько интеграционных тестов (используя nunit), и для этого я решил сделать BaseRepositoryTest - вот так:

public abstract class BaseRepositoryTests<T> where T : BaseEntity
{
    public abstract IBaseRepository<T> GetRepository();
    public abstract T GetTestEntity();

    [Test]
    public void AddWhenCallingAddsObjectToDatabase()
    {
        IBaseRepository<T> repository = GetRepository();
        T entity = GetTestEntity();

        repository.Add(entity);
    }
}

Теперь для каждого объекта домена мне нужно будет реализовать, как инициализировать репозиторий и как создать тестовую сущность. , что кажется справедливым, учитывая, что они будут другими ...

Все, что мне нужно сейчас сделать, - это написать реальный тестовый прибор, верно? Вот так:

[TestFixture]
public class FooRepositoryTests: BaseRepositoryTests<Foo>
{
    public override IBaseRepository<Foo> GetRepository()
    {
        throw new NotImplementedException();
    }

    public override Foo GetTestEntity()
    {
        throw new NotImplementedException();
    }
}

Это должно привести меня к началу и дать мне неудачный тест, так как бросок сломает его (я также попытался на самом деле реализовать методы без удачи). Но тестеры (пробовавшие как графический интерфейс для nunits, так и reharpers) просто игнорируют мой базовый тест! Он появляется и все - но сообщается как Ignored.

Итак, я немного покопался ... У NUnit есть это свойство в TextFixtureAttribute, которое позволяет вам указать, какого типа вы тестируете, поэтому я попытался поместить атрибут

[TestFixture(typeof(Foo))]

На первой версии Base, а также версии Foo. При установке на версию Foo он все равно просто игнорирует тест из базы, а когда я ставлю его на базу ... ну, он становится красным, потому что методы выдают исключения, что было бы хорошо, за исключением того, что даже когда я делаю фактическую реализацию в FooTests они по-прежнему не будут работать (очевидно, что базовый тест с учетом атрибута TestFixture никогда не будет знать, какие классы наследуют от него, поэтому как он узнает, чтобы найти реализацию).

Так что же я застрял? Я мог бы сделать тест в базовом тестовом классе виртуальным, а затем переопределить его в FooBaseRepositoryTests, только для вызова реализации из базы, что, я думаю, является неудачным решением ...

Что еще можно сделать? Я что-то упускаю? Пожалуйста, помогите, кто-нибудь ...:)

12
задан Per Hornshøj-Schierbeck 31 August 2010 в 19:50
поделиться

1 ответ

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

0
ответ дан 2 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: