模拟注册表 - SystemWrapper [英] Mocking the Registry - SystemWrapper

查看:30
本文介绍了模拟注册表 - SystemWrapper的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试将其作为模拟注册表的指南:http://www.rhyous.com/2011/11/04/unit-testing-registry-access-with-rhinomocks-and-systemwrapper/

I've tried following this as a guide for Mocking the registry: http://www.rhyous.com/2011/11/04/unit-testing-registry-access-with-rhinomocks-and-systemwrapper/

当我尝试模拟它时,我总是在我的班级中尝试执行 OpenSubKey 调用时得到reg"的空返回,在我的 _Real() 测试中它工作正常.

When I try to Mock it, I always get a null return for "reg" in my class when it tries to do the OpenSubKey call, in my _Real() test it works fine.

测试:

private RegistryService CreateMockedRegistryService()
{
    var registryService = new RegistryService(MockRepository.GenerateMock<ILoggerFacadeExtended>(), MockRepository.GenerateMock<IConnectivityService>());
    // Mock the Base Key so we can throw errors and manipulate it
    registryService.ChangeBaseKey(MockRepository.GenerateMock<IRegistryKey>());
    return registryService;
}

private IRegistryKey CreateMockedHKLM()
{
    IRegistryKey hklmMock = MockRepository.GenerateMock<IRegistryKey>();
    hklmMock.Stub(x => x.Name).Return("HKEY_LOCAL_MACHINE");
    return hklmMock;
}

[TestMethod()]
public void GetRegistryKeyTest_Mocked()
{
    IRegistryService target = CreateMockedRegistryService();
    string machineName = "localhost";
    RegistryHive hive = RegistryHive.LocalMachine;
    string path = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion";
    string valueName = "SystemRoot";
    object defaultValue = @"C:\Windows";

    IRegistryKey keyMock = CreateMockedHKLM();
    keyMock.Stub(x => x.OpenRemoteBaseKey(hive, machineName)).Return(CreateMockedHKLM());
    var subKeyMock = MockRepository.GenerateMock<IRegistryKey>();
    subKeyMock.Stub(x => x.Name).Return(keyMock.Name + @"\" + path);
    subKeyMock.Stub(x => x.GetValueNames()).Return(new string[] { valueName });
    subKeyMock.Stub(x => x.GetValue(valueName)).Return(defaultValue);

    keyMock.Stub(x => x.OpenSubKey(path)).Return(subKeyMock);
    keyMock.Stub(x => x.GetValue(valueName)).Return(defaultValue);
    target.ChangeBaseKey(keyMock);

    IResult<object> expected = new Result<object>() { Results = defaultValue };
    IResult<object> actual;
    actual = target.GetRegistryKey(machineName, hive, path, valueName, defaultValue);

    Assert.AreEqual(expected.Results, actual.Results);
}

[TestMethod()]
public void GetRegistryKeyTest_Real()
{
    IRegistryService target = CreateMockedRegistryService();
    string machineName = "localhost";
    RegistryHive hive = RegistryHive.LocalMachine;
    string path = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion";
    string valueName = "SystemRoot";
    object defaultValue = @"C:\Windows";

    // We don't want to use the regular Mocked version but actually hit the registry so it works
    IRegistryKey baseKey = new RegistryWrap().LocalMachine;
    target.ChangeBaseKey(baseKey);

    IResult<object> expected = new Result<object>() { Results = defaultValue };
    IResult<object> actual;
    actual = target.GetRegistryKey(machineName, hive, path, valueName, defaultValue);

    Assert.AreEqual(expected.Results, actual.Results);
}

实际课程:

private IRegistryKey _BaseKey;
public IRegistryKey BaseKey
{
    get
    {
        if (_BaseKey == null)
        {
            _BaseKey = new RegistryWrap().LocalMachine;
        }
        return _BaseKey;
    }
}

public void ChangeBaseKey(IRegistryKey inBaseKey)
{
    _BaseKey = inBaseKey;
}

public IResult<object> GetRegistryKey(string machineName, RegistryHive hive, string path, string valueName, object defaultValue)
    {
        return GetRegistryKey(BaseKey.OpenRemoteBaseKey(hive, machineName), path, valueName, defaultValue);
    }
}

public IResult<object> GetRegistryKey(IRegistryKey baseKey, string path, string valueName, object defaultValue)
{
    IResult<object> result = new Result<object>();
    try
    {
        if (baseKey == null) throw new ArgumentNullException("baseKey");
        if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("path");
        if (string.IsNullOrWhiteSpace(valueName)) throw new ArgumentException("valueName");
        var reg = baseKey.OpenSubKey(path);
        result.Results = reg.GetValue(valueName); // reg is null when I try to Mock it
     .....
    }
}

推荐答案

我想通了,我将处理 OpenSubKey 的存根添加到初始 keyMock 而不是 OpenSubKey 返回的那个代码>OpenRemoteBaseKey()

I figured it out, I was adding the Stubs dealing with OpenSubKey to the initial keyMock and not the one that was returned by OpenRemoteBaseKey()

这是固定代码:

[TestMethod()]
public void GetRegistryKeyTest_Mocked()
{
    IRegistryService target = CreateMockedRegistryService();
    string machineName = "localhost";
    RegistryHive hive = RegistryHive.LocalMachine;
    string path = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion";
    string valueName = "SystemRoot";
    object defaultValue = @"C:\Windows";


    var keyMock = CreateMockedHKLM();
    var remoteKeyMock = CreateMockedHKLM();
    var subKeyMock = MockRepository.GenerateMock<IRegistryKey>();
    subKeyMock.Stub(x => x.Name).Return(keyMock.Name + @"\" + path);
    subKeyMock.Stub(x => x.GetValueNames()).Return(new string[] { valueName });
    subKeyMock.Stub(x => x.GetValue(valueName)).Return(defaultValue);
    remoteKeyMock.Stub(x => x.OpenSubKey(path)).Return(subKeyMock);
    remoteKeyMock.Stub(x => x.GetValue(valueName)).Return(defaultValue);

    keyMock.Stub(x => x.OpenRemoteBaseKey(hive, machineName)).Return(remoteKeyMock);
    target.ChangeBaseKey(keyMock);

    actual = target.GetRegistryKey(machineName, hive, path, valueName, defaultValue);

    Assert.AreEqual(expected.Results, actual.Results);
    subKeyMock.AssertWasCalled(x => x.GetValue(valueName));
}

这篇关于模拟注册表 - SystemWrapper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆