Инициализировать FakeRepository‹› вместо Repository‹› с помощью StructureMap

У меня есть следующий интерфейс репозитория

public interface IRepository<TEntity> {

    TEntity FindById(int id);
    TEntity FindById(long id);
     etc
}

Затем у меня есть следующий класс репозитория, который наследуется от интерфейса выше

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class {
        private DB _context;

        public Repository() {
            _context = new DB();
        }

        public Repository(DB context) {
            _context = context;
        }

        Methods.....
}

Я создал FakeRepository‹>, который также наследуется от IRepository‹>

public class FakeRepository<TEntity> : IRepository<TEntity> where TEntity : class {
        private FakeDataContext _context;

        public FakeRepository() {
            _context = new FakeDataContext();
        }

        public FakeRepository(FakeDataContext context) {
            _context = context;
        }

        Methods....
}

Единственная разница между репозиторием и подделкой заключается в том, что вместо использования DBContext LinqToSQL я создал поддельный для целей тестирования.

Что я тогда могу сделать в своих модульных тестах:

ObjectFactory.Initialize(x => { x.For(typeof(Repository<>)).Use(typeof(FakeRepository<>)); });

Таким образом, мои тесты всегда будут запускаться с использованием в памяти fakedbcontext.

Однако я получаю ошибку типа плагина 104, и я не знаю, почему?


person Gaz    schedule 12.08.2011    source источник


Ответы (2)


В вашей Initialize вы должны сопоставить IRepository с FakeRepository. Не репозиторий против FakeRepository. Затем в ваших тестах, когда вы запрашиваете экземпляр IRepository, вы получите поддельный.

ObjectFactory.Initialize(x => { x.For(typeof(IRepository<>)).Use(typeof(FakeRepository<>)); });
person Bassetassen    schedule 13.08.2011
comment
Единственная проблема заключается в том, что я создаю конкретные репозитории, такие как этот открытый класс UserRepository : Repository‹Entities.User›, так что это не сработает - person Gaz; 15.08.2011
comment
Если UserRepository является производным от репозитория, он всегда будет производным от репозитория. StructureMap не может изменить тип, из которого происходят ваши классы. Он может только поменять местами зависимости. - person Joshua Flanagan; 17.08.2011

Почему вы не используете Dev Magic Fake, у него есть репозиторий Fake со многими функциями, такими как сохранение любого типа, извлечение любого типа с идентификатором, он может сохранять тип постоянным путем сериализации памяти, он также может генерировать данные для ваших типов и многое другое. другие функции для получения дополнительной информации вы можете увидеть по следующей ссылке:

http://devmagicfake.codeplex.com/

Спасибо

М. Радван

person Mohamed.Radwan -MVP    schedule 06.09.2011