2010-09-09 84 views
3

我在单元测试中注册我的Unity 2类型时很困难。统一单元测试 - 注册类型

下面是类的测试片段:

public class SomeService : ISomeService 
{ 
    private int SomeVar { get; set; } 

    [Dependency] 
    public ISessionManager SessionManager { get; set; } 

    public SomeService() 
    { 
     SomeVar = SessionManager.Get<int>("SomeVar"); 
    } 
} 

下面是我在我的MSTest ClassInitialize方法:

private static ISomeService _someService; 
private static IUnityContainer _unityContainer; 
[ClassInitialize] 
public static void MyClassInitialize(TestContext testContext) 
{ 
    var mockSessionManager = new Mock<ISessionManager>(); 

    mockSessionManager.Setup(foo => foo.Get<int>(It.IsAny<string>())).Returns(1); 

    _unityContainer = new UnityContainer() 
     .RegisterInstance(mockSessionManager.Object) 
     .RegisterType<ISomeService, SomeService>(
      new InjectionProperty("SessionManager")); 

    _someService = _unityContainer.Resolve<IAdditionalCoveragesService>(); 
} 

对于每一个测试方法,我有,当我调试和步进入SomeService的构造函数,它说SessionManager为空。我在尝试在Unity中注册我的类型时做错了什么?

注 - 我正在使用Moq来建立一个应该注入SomeService的模拟会话管理器。

谢谢!

回答

2

因为它是一个注入属性:该属性是在创建后设置的。要在构造函数中使用SessionManager你应该使用构造器注入:

public class SomeService : ISomeService 
{ 
    private int SomeVar { get; set; } 

    public ISessionManager SessionManager { get; private set; } 

    public SomeService(ISessionManager sessionManager) 
    { 
     SessionManager = sessionManager; 
     SomeVar = SessionManager.Get<int>("SomeVar"); 
    } 
} 

和:

_unityContainer = new UnityContainer() 
     .RegisterInstance(mockSessionManager.Object) 
     .RegisterType<ISomeService, SomeService>(); 
+0

对,但是我宁愿没有创建一个新的构造函数来设置SessionManager。是不可能在构造函数之前注入属性? – 2010-09-10 11:15:07

+0

如何在对象存在之前设置属性?如果你不想添加一个构造函数,你可以把你的逻辑放在SessionManager的设置器中 – onof 2010-09-10 11:54:49

+1

是的,你的SessionManager在构造函数,句点,DI容器中总是为空。属性不会那样工作。 – 2010-09-11 23:42:15