如何为没有参数的方法编写测试方法?

时间:2014-10-20 12:11:15

标签: c# tdd

我正在尝试理解TDD,但我见过的所有示例都显示了add(),substract()等方法。我了解如何通过unittest进行测试。但是如何测试没有参数的方法?

例如,您如何为此方法编写测试方法?

    public List<string> testmethod()
    {
        List<string> ret = new List<string>();
        using (SqlConnection conn = new SqlConnection(constring))
        using (SqlCommand cmd = conn.CreateCommand())
        {
            SqlDataReader reader;
            cmd.CommandText = "select * from users";

            conn.Open();
            reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                ret.Add(reader["name"].ToString());
            }
            conn.Close();
        }
        return ret;
    }

我的意思是,你需要测试什么?

2 个答案:

答案 0 :(得分:5)

从技术上讲,你不会单元测试那种方法。由于代码耦合到数据库,因此它将是集成测试。 (如果您希望单独测试逻辑数据访问,那么您可以将其分为两个组件,一个包含逻辑,另一个包含数据访问。)

除了那个小小的挑剔之外,模式是一样的。任何可重复的自动化测试都应该有三个步骤:

  1. 安排
  2. 断言
  3. 假设&#34;法案&#34;步骤就是这样:

    var result = testmethod();
    

    那么,&#34; Assert&#34;步?你怎么知道这种方法做了它应该做的事情?它会返回一个结果,所以我想你会检查这个结果,看看它是否符合你预期的某些已知条件。

    这些条件是什么?这就是&#34;安排&#34;步。这个想法是你设置了一个已知的场景,你期望得到一个已知的结果。然后执行代码。然后检查结果是否符合预期。

    例如,请考虑此对象,而不是您已经知道如何测试的Add(1, 1)示例:

    public class Adder
    {
        public int Augend { get; set; }
        public int Addend { get; set; }
    
        public int Add()
        {
            return Augend + Addend;
        }
    }
    

    (我知道这是一个愚蠢的对象,但请耐心等待。)

    您如何自行测试该方法?首先建立环境:

    // Arrange
    var adder = new Adder();
    adder.Augend = 1;
    adder.Addend = 1;
    
    // Act
    var result = adder.Add();
    
    // Assert
    Assert.AreEqual(2, result);
    

    在你的情况下&#34;安排&#34;步骤可能会非常复杂,因为它可以直接访问数据库。但这个概念是一样的。测试首先创建系统的已知状态,然后执行操作,然后检查系统的新状态。 (如果状态的创建和状态的检查,以及之后留下的副作用,有点麻烦,那么很好地表明代码中的耦合太多了,你和#39;我想把事情分开一点。)

答案 1 :(得分:4)

你的方法实际上做了很多事情,包括:

  1. 执行查询
  2. 将查询结果转换为字符串列表。
  3. 不幸的是,其中一件事并不适合单元测试(执行查询),但另一件事情是。理想情况下,您应该拆分方法,然后测试转换逻辑。