Автофак и Делепортер - PullRequest
       30

Автофак и Делепортер

1 голос
/ 24 февраля 2012

Я пытаюсь заставить Deleporter выполнить несколько тестов интеграции между процессами. Тесты выполняются с использованием WatiN для нашего приложения ASP.NET MVC3. Мы используем Autofac для внедрения зависимостей.

Я посмотрел в блоге Стива Сандерсона о том, как настроить его так, чтобы он возвращал ложное хранилище с помощью NInject.

// Inject a mock IDateProvider, setting the clock back to 1975
var dateToSimulate = new DateTime(1975, 1, 1);
Deleporter.Run(() => {
    var mockDateProvider = new Mock<idateProvider>();
    mockDateProvider.Setup(x => x.CurrentDate).Returns(dateToSimulate);
    NinjectControllerFactoryUtils.TemporarilyReplaceBinding(mockDateProvider.Object);
});

Существует ли Autofac-эквивалент TemporaryReplaceBinding?

Я попробовал следующее ниже, но получил ошибку «Невозможно создать область действия запроса, поскольку HttpContext недоступен».

Таблица передается SpecFlow.

        var tableSerialized = new SerializableTable(table);

        Deleporter.Run(() =>
        {
            var mockRepository = new Mock<IRepository<SmsMessageReceived>>();
            mockRepository.Setup(x => x.Table)
                .Returns((from row in tableSerialized.Rows
                          select new SmsMessageReceived
                          {
                              DateCreated = DateTime.Now,
                              Id = Int32.Parse(row[ColumnId]),
                              MessageBody = row[ColumnMessageBody]
                          }).AsQueryable() as IQueryable<SmsMessageReceived>);

            var builder = new ContainerBuilder();
            builder.RegisterInstance(mockRepository.Object);
            var container = builder.Build();
            builder.Update(container);
        });

1 Ответ

0 голосов
/ 27 февраля 2012

Это была ошибка с моей стороны.В коде выше я пропустил, как я получал контейнер для обновления.Я делал это с помощью вызова

DependencyResolver.Current.GetService ()

. Это было тем, что выдавало ошибку о недоступном HttpContext.

Я удалил это изатем в моем Global.asax.cs я добавил статический экземпляр для хранения созданного IContainer.Поэтому изменение кода, который запускает Deleporter на

        Deleporter.Run(() =>
        {
            var mockRepository = new Mock<IRepository<SmsMessageReceived>>();
            mockRepository.Setup(x => x.Table)
                .Returns((from row in tableSerialized.Rows
                          select new SmsMessageReceived
                          {
                              DateCreated = DateTime.Now,
                              Id = Int32.Parse(row[ColumnId]),
                              MessageBody = row[ColumnMessageBody]
                          }).AsQueryable() as IQueryable<SmsMessageReceived>);
            var builder = new ContainerBuilder();
            builder.RegisterInstance(mockRepository.Object);
            builder.Update(MvcApplication.Container);
        });

MvcApplication, является классом в Global.asax.cs.

Затем добавили ссылку на Moq в мой веб-проект, и теперь он работает отлично.

Интересно, есть ли лучший способ получить контейнер, чем статический, но это работает.

...