Unity单元测试 - 注册类型

时间:2010-09-09 15:05:24

标签: unit-testing unity-container

我在单元测试中注册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 个答案:

答案 0 :(得分: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>();