我需要对受保护的方法进行单元测试,因为它有一些核心逻辑(我无法更改此部分,因为它不在我的控制之下)。它不会更改任何成员,因此无法基于此编写断言。除了从注册表读取并写入日志文件之外,它不会返回任何内容。如何针对此场景使用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
创建private
和protected
个实例。有人可以帮忙吗?
答案 0 :(得分:1)
您应该注入registryAccessor
和logger
,这样您就可以控制代码从注册表中读取的内容,并通过检查对logger
的调用来确认输出。
否则你可以尝试一些集成测试(在你的情况下可能更难)或类似TypeMock
答案 1 :(得分:0)
你不能。
像TypeMock这样的商业工具使用Profiler API来实现这样的目标。这将允许拦截密封类,静态方法等。