2010-09-09 3 views
3

J'ai du mal à enregistrer mes types pour Unity 2 dans mes tests unitaires.Tests unitaires d'unité - types d'enregistrement

Voici un extrait de la classe en cours de test:

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

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

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

Voici ce que j'ai dans ma méthode 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>(); 
} 

Pour chaque méthode d'essai que j'ai, quand je debug et l'étape Dans le constructeur de SomeService, il est dit que SessionManager est null. Qu'est-ce que je fais de mal à essayer d'enregistrer mes types dans Unity?

Remarque - J'utilise Moq pour configurer un gestionnaire de session fictif qui doit être injecté dans SomeService.

Merci !!!

Répondre

2

Parce que c'est une propriété d'injection: la propriété est définie après avoir été créée. Pour utiliser SessionManager dans le constructeur, vous devez utiliser l'injection de constructeur:

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"); 
    } 
} 

et:

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

droit, mais je préfère ne pas avoir à créer un nouveau constructeur pour définir le SessionManager. Est-il impossible d'injecter la propriété avant le constructeur? –

+0

Comment définir une propriété avant qu'un objet existe? Si vous ne voulez pas ajouter un constructeur, vous pouvez mettre votre logique dans le setter de SessionManager – onof

+1

Oui, votre SessionManager sera toujours nul dans le constructeur, la période, le conteneur DI ou non. Les propriétés ne fonctionnent pas de cette façon. –