繁体   English   中英

单元测试时控制私有方法的输出

[英]Controlling private method output when unit testing

我正在将Nunit测试与Rhino模拟一起用于代码单元测试。 我已经遇到以下情况,请给我建议以解决这种情况。

public bool IsValidFile()
{
    ...
    ...
    if(IsValidCheksum(x, y))
    {
        ...
    }
    else
    {
        ...
    }
}

private bool IsValidCheksum(string pathTofile, string receivedChecksum)
{
}

当我对IsValidFile()方法进行单元测试时,我想测试两个是否满足条件的方案。 但是由于我没有控制权来处理IsValidCheksum方法的输出, IsValidCheksum它始终返回false。 我无法测试真实的情况。

有什么方法可以强制此方法的返回值。

我看到了三种可以强制IsValidCheksum返回单元测试中所需值的方法

  1. 模拟IsValidCheksum中使用的一些依赖项,以便该方法返回所需的值
  2. 将IsValidCheksum方法设为虚拟并受保护-通过这种方式,您可以使用如下模拟框架对它进行模拟:

     protected virtual bool IsValidCheksum(string pathTofile, string receivedChecksum) 

    您还可以将IsValidCheksum设置为内部受保护的虚拟:

     internal protected virtual bool IsValidCheksum(string pathTofile, string receivedChecksum) 

    并设置包含您的类的项目,以便内部可见于您的单元测试项目。 为此,请在AssemblyInfo.cs文件中添加属性:

     [assembly: InternalsVisibleTo("UnitTestProjectName")] 

    这样,您的单元测试项目将能够模拟您的方法,而对于其他项目,您的方法将保持私有。

  3. 提取IsValidCheksum方法以分离实现定义IsValidCheksum的接口的类,使您的类依赖于该Iterface,并在单元测试中使用模拟的接口,IsValidCheksum返回所需的内容。

您可以使用反射。

    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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM