Так что в основном у меня есть объект домена и универсальный репозиторий, который может выполнять операции 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, только для вызова реализации из базы, что, я думаю, является неудачным решением ...
Что еще можно сделать? Я что-то упускаю? Пожалуйста, помогите, кто-нибудь ...:)
Я не пробовал ваш пример, но вы можете попробовать, если поместите атрибуты TestFixture и Test в один и тот же класс. Попробуйте также поместить его в базовый класс.