2010-09-09 86 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