Юнит-тестирование Unity - регистрация типов - PullRequest
3 голосов
/ 09 сентября 2010

Мне трудно регистрировать свои типы для 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 имеет значение null. Что я делаю неправильно, пытаясь зарегистрировать свои типы в Unity?

Примечание. Я использую Moq для настройки фиктивного менеджера сеансов, который должен быть внедрен в SomeService.

Спасибо !!!

1 Ответ

2 голосов
/ 10 сентября 2010

Поскольку это свойство инъекции: свойство устанавливается после создания.Чтобы использовать 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>();
...