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

Dav*_*ave 1 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;
    }
Run Code Online (Sandbox Code Playgroud)

我的意思是,您必须测试什么?

Maa*_*ten 5

你的方法实际上做了很多事情,它们是:

  1. 执行查询
  2. 将查询结果转换为字符串列表。

不幸的是,其中之一并不真正适合单元测试(查询的执行),但另一件事是。所以理想情况下你应该拆分你的方法,然后你可以测试转换逻辑。


Dav*_*vid 5

从技术上讲,您不会对该方法进行单元测试。由于代码已耦合到数据库,因此将是一个集成测试。(如果您想将逻辑与数据访问分开进行测试,则可以将其分为两个部分,一个包含逻辑,另一个包含数据访问。)

除了那小小的nitpick,模式是相同的。任何可重复的自动化测试都应包含三个步骤:

  1. 安排
  2. 法案
  3. 断言

假设“ Act”步骤就是这样:

var result = testmethod();
Run Code Online (Sandbox Code Playgroud)

那么,什么是“声明”步骤?您怎么能知道这种方法应做的事?它返回一个结果,所以我想您会检查该结果,以了解在给定的已知条件下它是否正是您所期望的。

这些条件是什么?那是“安排”步骤。这个想法是您建立一个已知的方案,在该方案中您可以预期一个已知的结果。然后执行代码。然后,您检查结果是否符合预期。

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

public class Adder
{
    public int Augend { get; set; }
    public int Addend { get; set; }

    public int Add()
    {
        return Augend + Addend;
    }
}
Run Code Online (Sandbox Code Playgroud)

(我知道这是一个愚蠢的东西,但是要忍受我。)

您将如何单独测试该方法?首先设置环境:

// Arrange
var adder = new Adder();
adder.Augend = 1;
adder.Addend = 1;

// Act
var result = adder.Add();

// Assert
Assert.AreEqual(2, result);
Run Code Online (Sandbox Code Playgroud)

在您的情况下,“排列”步骤可能会涉及到很多,因为可以直接访问数据库。但是概念是相同的。测试首先创建系统的已知状态,然后执行操作,然后检查系统的新状态。(如果状态的创建和状态的检查以及之后留下的副作用有些繁琐,那么这很好地表明了代码中的耦合过多,并且您希望将其分解开一点点。)