是否可以在C#单元测试中测试SQL数据?

时间:2017-04-10 22:16:47

标签: c# unit-testing

public ApplicationLayout Get(string objectName, string userName)
{
    using (var db = new SqlConnection(_connectionString))
    {
        var sql = "SELECT * FROM dbo.ApplicationLayout WHERE ObjectName = @ObjectName AND UserName=@UserName";

        return db.Query<ApplicationLayout>(sql, new {ObjectName = objectName, UserName = userName}).FirstOrDefault();
    } 
}

我这里有一些代码,我想知道是否可以使用SQL数据(任何框架)在C#中执行单元测试。从我所看到的情况来看,这是不可能的。有人可以证实这一点吗?

2 个答案:

答案 0 :(得分:-1)

我总是在专用数据库上进行测试。您可以进行设置和拆卸,并在每次运行这些测试时基本上重新创建数据库(或从备份中恢复)。它比简单的C#单元测试更复杂。就像一些评论所说,它不再是真正的单元测试,但需要以某种方式测试。

答案 1 :(得分:-1)

可能,但不推荐用于单元测试。

当你谈到单元测试时,你通常会谈论一个可以单独重复执行的测试;也就是说,它在它所存在的代码程序集之外没有依赖关系(理想情况下,每个测试都不应该远远超出被测试的单个类),并且无论测试是如何开始或停止的,都没有持久的副作用(没有'需要使用文件系统或数据库等)。这是因为单元测试是最小和最细粒度的测试,旨在测试您自己编写的代码。您没有编写SQL Server,因此SQL Server不应该在单元测试的范围内。

现在,一旦你扩大了集成测试和验收测试的范围,现在你正在测试你编写的代码与你没有编写的所有外部依赖关系。集成测试可以触及外部数据,如数据库,只要在运行后将持久数据库恢复到原始状态,或者只是使用它们,就可以写入以及从这些外部存储中读取,只要它们能够正确地进行清理。像SQLite或MSS Express这样的可移植数据库,在测试设置中设置必要的模式和测试数据,然后在完成后将数据库吹掉。

对于许多人来说,这是分裂,并且像MSTest或NUnit这样的单元测试框架不会阻止您使用它们来创建具有外部依赖性的测试。这些仅仅是将完整的测试套件构建为细粒度,快速运行,可重复的组件的好主意,您可以对所做的任何更改进行运行,以及可能在一夜之间运行的更长时间,更广泛的正确性证明。