将StructureMap与单元测试结合使用

时间:2010-02-07 10:12:11

标签: c# asp.net unit-testing structuremap

我在DI IOC的Web项目中使用StructureMap。它工作得很完美,但我不知道如何使用StructureMap编写单元测试。

我应该在AssemblyInitialize中开始配置StructureMap的配置,就像在global.asax中一样,除了datacontext不使用实时的LinqToSqlDataContext,但是有些内存数据是这样的:

 [AssemblyInitialize]
 public static void Start()
 {
        ObjectFactory.Configure(x =>
                {
                    x.For<IDataContext>().HttpContextScoped().Use<MemoryDataContext>()
                        .Ctor<string>("connectionString")
                        .Is(ConfigurationManager.ConnectionStrings["DEVConnection"].ConnectionString);
                    x.For<IDepartamentRepository>().Use<DepartamentDB>();
                    x.For<IDevelopmentProcess>().Use<DevelopmentProcesses>().OnCreation(c => c.User = Current.CurrentUser);
                    x.For<IActivityProcess>().Use<ActivitiesProcess>().OnCreation(c=> c.User = Current.CurrentUser);
                    x.For<IDevDeveloperRepository>().Use<DevDeveloperDB>();
                    x.For<IDevelopmentRepository>().Use<DevelopmentDB>();
                    x.For<IActivityRepository>().Use<ActivityDB>();
                    x.For<IActivityTypeRepository>().Use<ActivityTypeDB>();
                    x.For<IDevUserRepository>().Use<DevUsersDB>();
                    x.For<IAttachmentRepository>().Use<AttachmentDB>();
                }
            );
 }

然后使用ObjectFactory.GetInstance()测试或我该怎么做?

2 个答案:

答案 0 :(得分:21)

您根本不需要use a DI Container in unit tests

容器是用于将组件连接在一起的东西,但单元测试是对每个组件进行单独测试。

答案 1 :(得分:5)

我同意马克。可测试性是您可能首先使用容器的主要原因之一。

有时候为容器设置创建集成测试可能是个好主意。例如,如果容器配置中有任何行为,则需要为该行为创建测试。在容器配置中,您可以通过配置管理器设置 IDataContext 的连接字符串。

以下代码与我测试此类设置的代码类似。注意我避免使用ObjectFactory(静态单例对象有自己的问题)并将我的容器设置包装在bootstrapper helper类中:

[Test]
public void connection_string_should_come_from_application_configuration()
{
  var container = new ContainerBootstraper().Container;

  var connectionString = container.GetInstance<IDataContext>().ConnectionString

  connectionString.ShouldEqual("test project application configuration connection string");
}