Jam*_*ord 5 .net c# unit-testing moq
我想测试GetParameters()断言返回值包含值中的"test =".不幸的是,负责这个的方法是私有的.有没有办法为此提供测试覆盖?我遇到的问题如下:
if (info.TagGroups != null)
Run Code Online (Sandbox Code Playgroud)
问题是我的测试中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");
}
Run Code Online (Sandbox Code Playgroud)
实现类来测试
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
直接测试私有方法(而不是通过类的公共API间接测试)通常是一个坏主意.但是,如果需要,可以通过反射来完成.
更好的选择是重构代码以使其更易于测试.有很多方法可以做到这一点,这里有一个选项:
它看起来像你要测试的逻辑AppendTag.这是一个静态方法,并且不会修改任何状态,那么为什么不直接通过测试使其公开和可调用?
以同样的方式,您还可以GetParameters通过为其提供附加ArticleInfo参数来使公共静态.
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |