gpt4 book ai didi

c# - 仅将不同的 SQL 命令用于单元测试的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 13:04:16 24 4
gpt4 key购买 nike

我有一个使用 NHibernate 的 .NET 项目。由于某些项目要求,非常具体的一段代码使用 HQL 使用“order by newid()”来选择随机记录。但是,出于单元测试的目的,我使用的是内存中的 SQLite 数据库,它当然会阻塞 newid()。只有在从单元测试运行时,我才需要让此方法使用备用的 SQLite 兼容查询。我不能只为单元测试目的添加条件编译常量,#define 只能在文件级别工作,所以我也不能简单地在那里添加常量。

我真的不想为了启用此单元测试而用一些垃圾代码搞砸我的存储库类。我有哪些选择?

编辑:

我已经有一个用于其他东西的全局类,所以我向它添加了一个静态 TestMode 属性,除了我在单元测试中明确设置它之外,它在任何时候都是假的,所以代码现在看起来像:

string random, update;
if (Globals.TestMode)
{
random = "from Customer order by random()";
}
else
{
random = "from Customer order by newid()";
}

这行得通,但我希望完全避免这样的 if 语句。仍在寻找建议。

最佳答案

您可以抽象出将 HQL 查询提供给注入(inject)到您的存储库中的单独类的责任。这样,您的测试代码就可以注入(inject)该类的不同实现(甚至是模拟实现),它提供您知道可以在 SQLite 服务器上运行的 HQL。

请记住,这并不是真正的单元测试,因为您要测试的不仅仅是您的代码。为了让您的测试通过,您需要依赖数据库和 NHibernate 提供程序才能正常工作。此外,不可能确定性地测试所选记录是“随机的”。单元测试是确定性的。您正在描述一个集成测试,因为您正在尝试通过 ORM 测试与数据库的交互。

问题是您尝试使用与生产中实际使用的数据库服务器不同的数据库服务器来测试它。这是值得怀疑的,因为正如您所注意到的,即使测试通过,您也不能保证代码在生产环境中实际工作。

关于c# - 仅将不同的 SQL 命令用于单元测试的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com