Итак, в основном у меня есть объект домена и общий репозиторий, который может выполнять операции 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 GUI и resharpers test runner) просто игнорировали мой базовый тест! Он отображается и все - но сообщается как игнорируется.
Итак, я немного поработал... NUnit имеет это свойство в TextFixtureAttribute, которое позволяет вам указать, какие вы тестируете, поэтому я попытался поместить атрибут
[TestFixture(typeof(Foo))]
Сначала база, а также версия Foo. Когда он помещается в версию Foo, он все еще просто игнорирует тест из базы, и когда я кладу его на базу... ну, он становится красным, потому что методы генерируют исключения, что было бы хорошо, за исключением того, что даже когда я выполняю фактическую реализацию в FooTests они все равно не сработают (очевидно, базовый тест, учитывая атрибут TestFixture, никогда не узнает, какие классы наследуют его, так как он узнает, чтобы найти реализацию).
Так что же мне делать? Я могу сделать тест в базовом тестовом классе виртуальным, а затем переопределить его в FooBaseRepositoryTests, только чтобы вызвать реализацию из базы, которая является хромым решением, которое я думаю...
Что еще нужно делать? Я что-то упускаю? Пожалуйста, помогите, кто-то...:)