如何对求和运算进行单元测试以确保操作实际上是求和的?

时间:2011-10-24 13:34:10

标签: c# unit-testing

我有以下属性:

public double TotalHours
{
    get
    {
        return (from session in sessions
                let ts = session.End.Subtract(session.Start)
                select ts.TotalHours).Sum();
    }
}

该财产应该在所有会议中完成所有小时的总和 我需要测试什么才能确保该属性总是汇总所有会话的所有小时数?

2 个答案:

答案 0 :(得分:4)

基本上是编制适当的样本数据的情况。例如,您可能想尝试以下测试:

  • 没有会话
  • 单个会话
  • 多个会话
  • 没有开始时间或没有结束时间的会话
  • 结束在开始之前的会话
  • 结束等于开始的会话

也许你已经进行了其他的数据验证,以确保不会发生“狡猾的”情况,但那些是我想到的事情的

答案 1 :(得分:1)

我建议您模拟Session来创建@Jon Skeet描述的测试数据。通过使用模拟,您可以将要测试的代码仅隔离到TotalHours属性,而不是属性和Session的实现。

使用moq,您可以执行以下操作来设置测试数据,调用TotalHours并断言结果是您期望的值:

var data = new List<ISession>
{
    Mock.Of<ISession>(s => s.Start == DateTime.Parse("12:00 AM") && s.End == DateTime.Parse("12:10 AM")),
    Mock.Of<ISession>(s => s.Start == DateTime.Parse("1:00 AM") && s.End == DateTime.Parse("1:15 AM")),
    Mock.Of<ISession>(s => s.Start == DateTime.Parse("2:00 AM") && s.End == DateTime.Parse("2:30 AM"))
};