如何在C#中单元测试KnockoutUtility?

时间:2017-02-14 12:46:39

标签: c# unit-testing

我有一个使用以下方法获取淘汰消息的类:

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%的覆盖率。

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

1 个答案:

答案 0 :(得分:1)

此单元测试未涵盖所有内容,因为您未验证所有情况。你必须测试两个逻辑:

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

基于这个假设,您必须创建证明以下内容的案例:

  • 如果data.Messagesnull,那么您必须验证该方法是否返回List<Message>()的新实例,因为您在代码中指定了此类实例。
  • 如果IEnumerable<Message>为空(表示此条件为data.Messages),则下一个案例将验证该方法是否返回空data.Messages.Count() == 0
  • 下一个案例是验证该方法是否返回满足您条件的确切消息: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
}

安排是您配置模型的地方。 操作是您执行要测试的方法的位置,断言是您进行断言的位置。