我的私人方法中的代码行从未被覆盖
本文关键字:覆盖 代码 方法 我的 | 更新日期: 2023-09-27 17:59:50
下面是动作方法的代码:
private static IEnumerable<SelectListItem> GetProductTypes()
{
System.Text.RegularExpressions.Regex filter = new System.Text.RegularExpressions.Regex("Prodcut1|Prodcut2|Prodcut3");
var prodtypes = from ProdType e in Enum.GetValues(typeof(ProdType))
where filter.IsMatch(e.ToString())
select new { Id = (int)e, Name = e.ToString() };
if (prodtypes != null)
{
return prodtypes .Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
}
return new List<SelectListItem>();
}
其中:ProdType是枚举。它包含了一些产品类型及其价值。
我已经为这种方法编写了单元测试:-
[TestMethod]
public void GetProductTypes_Test()
{
//Arrange
PrivateType pvtType = new PrivateType(typeof(ProductController));
//Act
var actual = (IEnumerable<SelectListItem>)pvtType.InvokeStatic("GetProductTypes");
//Assert
Assert.IsNotNull(actual);
Assert.IsInstanceOfType(actual, typeof(IEnumerable<SelectListItem>));
Assert.AreEqual(3, actual.ToList().Count); //here : 3 = Product1,Product2,Product3
}
但当我通过代码覆盖选项检查其代码覆盖率时,它没有覆盖以下代码行:-
return new List<SelectListItem>();
有人能告诉我我在这里做错了什么吗?是的,这是我正在测试的一种私人方法。因为我想测试所有的私有方法。
prodtypes
永远不会是null
要获得100%的覆盖率,您可以将方法调整为以下之一(只有第二部分-第一部分保持不变):
private static IEnumerable<SelectListItem> GetProductTypes()
{
//select prodtypes
if (prodtypes != null && prodtypes.Count() > 0)
{
return prodtypes.Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
}
return new List<SelectListItem>();
}
或者更短、更高性能的,因为它永远不应该是null
:
private static IEnumerable<SelectListItem> GetProductTypes()
{
//select prodtypes
return prodtypes.Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
}
但是
正如John所提到的:在大多数情况下,你不应该对私有方法进行单元测试,因为它们应该被一些公共接口/方法覆盖。如果它没有被涵盖,想想这个方法——也许它甚至不需要——已经发生在我身上好几次了
但我也添加了"在大多数情况下",因为在某些情况下测试私有方法是有意义的。例如,在我的情况下,我有一些针对硬件的错误处理方法,这些方法在正常的单元测试中没有附加,所以我直接调用"专用错误处理程序"来检查它是否正常工作。但你的方法看起来不像这样的情况。。。
更新
正如Episodex所建议的,一个更好的方法解决方案:
private static IEnumerable<SelectListItem> GetProductTypes()
{
var filter = new System.Text.RegularExpressions.Regex("Prodcut1|Prodcut2|Prodcut3");
return from ProdType e in Enum.GetValues(typeof(ProdType))
where filter.IsMatch(e.ToString())
select new SelectListItem
{
Value = ((int)e).ToString(),
Text = e.ToString()
};
}