ServiceLocator未在测试项目中初始化

时间:2011-06-24 20:59:49

标签: asp.net-mvc-3 nunit s#arp-architecture

当我尝试编写与我的新任务(MVC3,S#arp 2.0)相关的测试时,我在尝试运行测试时出现此错误:

  

MyProject.Tests.MyProject.Tasks.CategoryTasksTests.CanConfirmDeleteReadiness:   SetUp:System.NullReferenceException   :ServiceLocator还没有   初始化;我试图找回   SharpArch.NHibernate.ISessionFactoryKeyProvider   ----> System.NullReferenceException:对象引用未设置为   对象的实例。

     

在   SharpArch.Domain.SafeServiceLocator 1.GetService() at SharpArch.NHibernate.SessionFactoryKeyHelper.GetKeyFrom(Object anObject) at SharpArch.NHibernate.NHibernateRepositoryWithTypedId 2.get_Session()   在   SharpArch.NHibernate.NHibernateRepositoryWithTypedId 2.Save(T entity) at MyProject.Tests.MyProject.Tasks.CategoryTasksTests.Setup() in C:\code\MyProject\Solutions\MyProject.Tests\MyProject.Tasks\CategoryTasksTests.cs:line 36 --NullReferenceException at Microsoft.Practices.ServiceLocation.ServiceLocator.get_Current() at SharpArch.Domain.SafeServiceLocator 1.GetService()

其他不涉及新类的测试(例如,生成/确认数据库映射)运行正确。

我的ServiceLocatorInitializer如下

public class ServiceLocatorInitializer
{

public static void Init() 
{
    IWindsorContainer container = new WindsorContainer();

        container.Register(
                Component
                    .For(typeof(DefaultSessionFactoryKeyProvider))
                    .ImplementedBy(typeof(DefaultSessionFactoryKeyProvider))
                    .Named("sessionFactoryKeyProvider"));

    container.Register(
            Component
                .For(typeof(IEntityDuplicateChecker))
                .ImplementedBy(typeof(EntityDuplicateChecker))
                .Named("entityDuplicateChecker"));

    ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(container));
}
}

2 个答案:

答案 0 :(得分:5)

您正在注册DefaultSessionFactoryKeyProvider作为DefaultSessionFactoryKeyProvider的实现,而您依赖于ISessionFactoryKeyProvider,而windsor城堡不知道如何解析,因为没有为该接口注册任何实现。

我认为应该是:

container.Register(                 零件                     。对于(typeof运算(ISessionFactoryKeyProvider))                     .ImplementedBy(typeof运算(DefaultSessionFactoryKeyProvider))                     .Named( “sessionFactoryKeyProvider”));

答案 1 :(得分:2)

您的测试项目是否引用了Castle.Core?