2012-02-24 1 views
1

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

Я просмотрел блог Стива Сандерсона о том, как настроить его, чтобы вернуть ложный репозиторий, используя 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); 
}); 

Есть ли автофокусный эквивалент TemporarilyReplaceBinding?

Я пробовал следующее ниже, но получаю сообщение об ошибке «Область жизни запроса не может быть создана, потому что 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); 
     }); 

ответ

0

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

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 в мой веб-проект, и теперь он отлично работает.

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

Смежные вопросы