Вопрос

Мои контроллеры в моем приложении 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 в качестве сеанса. Пожалуйста, поправьте меня, если есть более эффективный способ сделать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top