Autofac和Deleporter

时间:2012-02-24 15:02:18

标签: asp.net-mvc-3 bdd watin autofac specflow

我正在尝试让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);
});

是否有与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);
        });

1 个答案:

答案 0 :(得分: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的引用,现在它完美无缺。

我想知道是否有更好的方法来获取容器而不是静态容器,但这确实有效。