我的私人方法中的代码行从未被覆盖

本文关键字:覆盖 代码 方法 我的 | 更新日期: 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>();

有人能告诉我我在这里做错了什么吗?是的,这是我正在测试的一种私人方法。因为我想测试所有的私有方法。

我的私人方法中的代码行从未被覆盖

正如Patryk已经说过的: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() 
                };
}