当我尝试编写与我的新任务(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.NHibernateRepositoryWithTypedId2.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));
}
}
答案 0 :(得分:5)
您正在注册DefaultSessionFactoryKeyProvider作为DefaultSessionFactoryKeyProvider的实现,而您依赖于ISessionFactoryKeyProvider,而windsor城堡不知道如何解析,因为没有为该接口注册任何实现。
我认为应该是:
container.Register( 零件 。对于(typeof运算(ISessionFactoryKeyProvider)) .ImplementedBy(typeof运算(DefaultSessionFactoryKeyProvider)) .Named( “sessionFactoryKeyProvider”));
答案 1 :(得分:2)
您的测试项目是否引用了Castle.Core?