2012-02-24 64 views
1

我想让Deleporter做一些跨进程集成测试。这些测试正在使用WatiN来对付我们的ASP.NET MVC3应用程序。我们使用Autofac进行依赖注入。Autofac和Deleporter

我看了Steve Sanderson的博客,关于设置它返回使用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的Autofac等价物?

我已经尝试了下面的内容,但得到一个错误“请求生存期范围无法创建,因为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的引用到我的web项目,现在它完美的工作。

我不知道是否有更好的方式来获取容器比静态,但这是行不通的。