单元测试c#并测试私有方法

我想测试GetParameters()断言返回值包含值中的“test =”.不幸的是,负责这个的方法是私有的.有没有办法为此提供测试覆盖?我遇到的问题如下:

if (info.TagGroups != null)

问题是我的测试中info.TagGroups等于null

谢谢,

测试

[Test]
public void TestGetParameters()
{
    var sb = new StringBuilder();
    _renderer.GetParameters(sb);
    var res = sb.ToString();
    Assert.IsTrue(res.IndexOf("test=") > -1, "blabla");
}   

实现类来测试

internal void GetParameters(StringBuilder sb)
{
    if (_dPos.ArticleInfo != null)
    {
        var info = _dPos.ArticleInfo;

        AppendTag(sb, info);

    }
}

private static void AppendTag(StringBuilder sb, ArticleInfo info)
{
    if (info.TagGroups != null)  // PROBLEM - TagGroups in test equals null
    {
        foreach (var tGroups in info.TagGroups)
        {
            foreach (var id in tGroups.ArticleTagIds)
            {
                sb.AppendFormat("test={0};", id);
            }
        }
    }
}
最佳答案
直接测试私有方法(而不是通过类的公共API间接测试)通常是一个坏主意.但是,如果需要,可以通过反射来完成.

更好的选择是重构代码以使其更易于测试.有很多方法可以做到这一点,这里有一个选项:

看起来你要测试的逻辑是在AppendTag中.这是一个静态方法,并且不会修改任何状态,那么为什么不直接通过测试使其公开和可调用?

以同样的方式,您还可以通过为其提供额外的ArticleInfo参数来使GetParameters公共静态.

转载注明原文:单元测试c#并测试私有方法 - 代码日志