2017-02-14 29 views
0

我有一个类,使用下面的方法获取敲除消息:如何在C#中测试KnockoutUtility?

public IEnumerable<Message> GetKnockoutMessages(Data data) 
    { 
     if(data.Messages != null) 
     { 
      return data.Messages.Where(m => m.UnderWritingRuleId != null); 
     } 
     else 
     { 
      return new List<Message>(); 
     } 
    } 

到目前为止,我有一个单元测试,仅部分地覆盖所述单元测试,其是下方。

[TestMethod] 
    public void TestGetKnockoutMessages() 
    { 
     KnockoutUtility knockUtility = new KnockoutUtility(); 
     IEnumerable<Message> messages = knockUtility.GetKnockoutMessages(MockData.Object); 
     Assert.IsNotNull(messages); 
    } 

这涵盖一切,但return data.Messages.Where(m => m.UnderWritingRuleId != null);

我不知道我会怎样单元测试这种方法来获得100%的覆盖率。

任何帮助,将不胜感激。谢谢

+0

为消息创建假数据源,您知道该数据源可能匹配或不匹配待测方法中的查询,该查询将覆盖至少两个筛选器的测试用例。为[Data]提供[mcve],以及如何为测试设置。 – Nkosi

回答

1

这个单元测试并没有涵盖所有因为你没有验证所有的情况。你必须测试两个逻辑:基于这个假设,你必须创建情况

  • if/else逻辑
  • Where(m => m.UnderWritingRuleId != null)逻辑

这证明如下:

  • 如果data.Messagesnull然后您必须验证该方法返回List<Message>()的新实例,因为您在代码中指定了这一点。
  • 如果data.Messages为空(表示此条件为data.Messages.Count() == 0),则下一个案例将验证该方法是否返回空IEnumerable<Message>
  • 下一个案例将验证该方法是否返回满足您的条件的确切消息:Where(m => m.UnderWritingRuleId != null)。换句话说,只有消息已经填充UnderWritingRuleId

为了实现我提到的你必须创建Data满足这种情况的对象。我不知道MockData.Object是什么,但是我希望你能把你安排在那里。

每个案件应在单独的测试方法,就像在以下几点:

[TestMethod] 
public void TestGetKnockoutMessages_Case1() 
{ 
    // Arrange 

    // Action 

    // Assert 
} 

[TestMethod] 
public void TestGetKnockoutMessages_Case2() 
{ 
    // Arrange 

    // Action 

    // Assert 
} 

[TestMethod] 
public void TestGetKnockoutMessages_Case3() 
{ 
    // Arrange 

    // Action 

    // Assert 
} 

安排是你配置你的实体模型的地方。 动作是执行想要测试的方法的地方,认定是在做断言的地方。

+0

你知道我会为每种情况编写单元测试吗?对不起,我对单元测试很新颖 – Cory

+0

@Cory是的,你应该为每种情况编写单独的测试方法。我会更新答案。 – kat1330

+0

感谢Kat,它使用了3种不同的测试用例。 – Cory

相关问题