我试图理解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;
    }


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

最佳答案

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

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


安排
法案
断言


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

var result = testmethod();


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

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

例如,代替您已经知道如何测试的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);


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

关于c# - 如何为没有参数的方法编写测试方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26465421/

10-12 12:44
查看更多