单元测试写入文件的void方法,不会改变任何类成员

时间:2016-05-24 20:08:37

标签: c# unit-testing

我需要对受保护的方法进行单元测试,因为它有一些核心逻辑(我无法更改此部分,因为它不在我的控制之下)。它不会更改任何成员,因此无法基于此编写断言。除了从注册表读取并写入日志文件之外,它不会返回任何内容。如何针对此场景使用Moq和VisualStudio NUnit测试编写单元测试:

protected override void OnPluginStarting()
{
    try
    {
        using (var key = registryAccessor.LocalMachine.OpenSubKey(ProdInstallRegKey))
        {
            foreach (string subkeyName in key.GetSubKeyNames())
            {
                using (var subkey = key.OpenSubKey(subkeyName))
                {
                    string displayName = subkey.GetValue("DisplayName") == null ? string.Empty : subkey.GetValue("DisplayName").ToString();
                    if (!string.IsNullOrEmpty(displayName) && installedProducts.ContainsKey(displayName))
                    {
                        Log.Info(installedProducts[displayName] + " version is " + subkey.GetValue("DisplayVersion"));
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        Log.Error("An error occured while getting the version numbers of DDP components. "+ex.Message);
    }
}

RegistryAccessor是注册表的包装器,我已经使用它,以便我可以从单元测试中模拟它。但是,当它不接受任何参数时,如何将模拟注册表对象传递给该方法?我唯一想到的是我可以使用PrivateObject创建privateprotected个实例。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您应该注入registryAccessorlogger,这样您就可以控制代码从注册表中读取的内容,并通过检查对logger的调用来确认输出。

否则你可以尝试一些集成测试(在你的情况下可能更难)或类似TypeMock

答案 1 :(得分:0)

你不能。

TypeMock这样的商业工具使用Profiler API来实现这样的目标。这将允许拦截密封类,静态方法等。