我正在尝试理解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;
}
我的意思是,你需要测试什么?
答案 0 :(得分:5)
从技术上讲,你不会单元测试那种方法。由于代码耦合到数据库,因此它将是集成测试。 (如果您希望单独测试逻辑数据访问,那么您可以将其分为两个组件,一个包含逻辑,另一个包含数据访问。)
除了那个小小的挑剔之外,模式是一样的。任何可重复的自动化测试都应该有三个步骤:
假设&#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)
你的方法实际上做了很多事情,包括:
不幸的是,其中一件事并不适合单元测试(执行查询),但另一件事情是。理想情况下,您应该拆分方法,然后测试转换逻辑。