2012-02-24 9 views
1

私はDeleporterにいくつかのクロスプロセス統合テストをさせようとしています。テストは、ASP.NET MVC3アプリケーションに対してWatiNを使用して実行されています。私たちは依存性注入のためにAutofacを使用します。Autofac and 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

これは私の間違いでした。上のコードでは、コンテナを取得する方法を忘れていました。私はこれがHttpContextを利用できないというエラーを投げていたものだった

DependencyResolver.Current.GetService()

への呼び出しを介してこれをやっていました。

これを取り除き、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のクラスです。

その後、私のWebプロジェクトにMoqへの参照が追加され、今では完全に機能します。

静的よりもコンテナを取得する方が良いかどうかは疑問ですが、これは機能します。