单元测试时控制私有方法输出
本文关键字:有方法 输出 控制 单元测试 | 更新日期: 2023-09-27 18:00:51
我使用Nunit测试和Rhino mock进行代码单元测试。我遇到了以下情况,请建议我处理这种情况。
public bool IsValidFile()
{
...
...
if(IsValidCheksum(x, y))
{
...
}
else
{
...
}
}
private bool IsValidCheksum(string pathTofile, string receivedChecksum)
{
}
当我对IsValidFile()
方法进行单元测试时,我想测试满足if条件的两种场景。但由于我无法控制CCD_ 2方法的输出,它总是返回false。我无法测试真实情况。
是否有任何方法可以强制此方法的返回值。
我看到了3种方法可以强制IsValidCheksum在单元测试中返回您想要的值
- 模拟IsValidCheksum中使用的一些依赖项,以便方法返回您想要的值
-
使IsValidCheksum方法虚拟化并受到保护-这样你就可以用你的模拟框架来模拟它,如下所示:
protected virtual bool IsValidCheksum(string pathTofile, string receivedChecksum)
您也可以将IsValidCheksum设置为内部保护虚拟:
internal protected virtual bool IsValidCheksum(string pathTofile, string receivedChecksum)
并设置包含您的类的项目,以便内部对您的单元测试项目可见。要在AssemblyInfo.cs文件中执行此操作,请添加属性:
[assembly: InternalsVisibleTo("UnitTestProjectName")]
这样,您的单元测试项目将能够模拟您的方法,而对于其他项目,您的方法将保持私有。
-
提取IsValidCheksum方法以分离实现接口定义IsValidCheksum的类,使您的类依赖于该迭代面,并在单元测试中使用模拟接口,IsValidCherksum返回您喜欢的任何内容。
您可以使用反射。
public static object InvokeMethod(object obj, string name, object[] parameters)
{
var method = obj.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance);
return method.Invoke(obj, parameters);
}
你可以在单元测试中调用你的方法:
[Test]
public void TestMethod()
{
var test = new YourClass();
test.IsValidFile();
bool isValid = TestHelper.InvokeMethod(test, "IsValidCheksum", "pathTofile", "receivedChecksum");
Assert.That(isValid, Is.True);
}