2012-02-24 63 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項目,現在它完美的工作。

我不知道是否有更好的方式來獲取容器比靜態,但這是行不通的。