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

时间:2015-07-03 03:51:41

标签: c# unit-testing

我正在使用Rhino mock进行Nunit测试以进行代码单元测试。我遇到了以下情况,请建议我处理这种情况。

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

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

当我进行单元测试IsValidFile()方法时,我想测试两种情况是否符合条件。但由于我无法控制处理IsValidCheksum方法的输出,因此它总是返回false。我无法测试真实场景。

有没有办法强制使用此方法的返回值。

2 个答案:

答案 0 :(得分:2)

我看到3种方法可以强制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的接口的类,使您的类依赖于该接口,并在单元测试中使用模拟接口与IsValidCheksum返回您喜欢的任何内容。

答案 1 :(得分:-1)

您可以使用反射。

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