Nibernate - тестирование подразделения с помощью ASP.NET MVC
-
08-10-2019 - |
Вопрос
Мои контроллеры в моем приложении MVC ASP.NET зависят от IDataContext, который является оберткой вокруг сеанса Nibsnate, чтобы я мог легко подставить это позже. Я использую контейнер Microsoft Unity IOC, чтобы ввести мои зависимости внутри конструкторов моих классов.
Сначала я попробовал создал факедиатаконтестку в моем тестовом проекте и настроить правильные зависимости следующим образом:
public class BaseControllerTest {
[TestInitialize]
public void Init() {
// Create the ioc container
var container = new UnityContainer();
// Setup the common service locator (must come before any instance registered that use the common service locator such as membership provider)
ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));
// Configure the container
container.RegisterType<IDataContext, FakeDataContext>();
}
}
Теперь все, что мне нужно сделать, это унаследовать из этого класса, и все работает нормально, но я чувствую, что факедиатаконтестку не является наиболее точным способом выполнения моих тестов, поэтому я пытаюсь создать в сеансе памяти с использованием SQLite. Я изменил вышесказанный к:
public class BaseControllerTest {
private static Configuration _configuration;
[TestInitialize]
public void Init() {
// Create the ioc container
var container = new UnityContainer();
// Configure the container
container.RegisterType<ISessionFactory>(new ContainerControlledLifetimeManager(), new InjectionFactory(c => {
return CreateSessionFactory();
}));
container.RegisterType<ISession>(new InjectionFactory(c => {
var sessionFactory = container.Resolve<ISessionFactory>();
var session = sessionFactory.OpenSession();
BuildSchema(session);
return session;
}));
container.RegisterType<IDataContext, NHibernateDataContext>();
}
private static ISessionFactory CreateSessionFactory() {
return Fluently.Configure()
.Database(SQLiteConfiguration.Standard.InMemory())
.Mappings(m => m.FluentMappings
.AddFromAssembly(Assembly.GetExecutingAssembly())
.Conventions.AddFromAssemblyOf<EnumConvention>())
.ExposeConfiguration(c => _configuration = c)
.BuildSessionFactory();
}
private static void BuildSchema(ISession session) {
var export = new SchemaExport(_configuration);
export.Execute(true, true, false, session.Connection, null);
}
}
Однако это бросает ошибку «Недопустимая или неполная конфигурация» использовалась при создании SessionFactory. ". Я подумал, что это может быть потому, что объекты, отображаемые сопоставлениями, находятся в другом проекте из тестового проекта, поэтому я попытался сказать Assame.loadfile («C: .. myassembly.dll») Но это все еще не сработало.
Обратите внимание, что я использовал следующую статью http://www.mohundro.com/blog/commentview ,guid ,fa72ff57-5c08-49fa-979e-c732df2bf5f8.aspx. Чтобы помочь, но не совсем то, что я ищу.
Я был бы признателен, если кто-то может помочь. Спасибо
Решение
Задача решена. Мне нужно было добавить ссылку на SQLite DLL. Я также изменил сеанс, чтобы использовать ContacterControlledLifetimeManager Aswell в качестве сеанса. Пожалуйста, поправьте меня, если есть более эффективный способ сделать это.