Visual Studio 2013:单元测试 SQL Server 数据库项目时模拟存储过程
Posted
技术标签:
【中文标题】Visual Studio 2013:单元测试 SQL Server 数据库项目时模拟存储过程【英文标题】:Visual Studio 2013: Mocking Stored Procedures when Unit Testing SQL Server Database Project 【发布时间】:2014-01-26 23:30:44 【问题描述】:我正在 Visual Studio 2013 中对 SQL Server 数据库项目进行单元测试。通过调用另一个存储过程sp_log
,将我要测试的存储过程的输出写入日志文件。
在我看来,检查我要测试的存储过程是否正常工作的最简单方法是模拟 sp_log
并使用测试条件来检查模拟存储过程的输出。
我可以在预测试脚本中创建一个模拟sp_log
,没问题。但是,在测试后脚本中,我想重新执行 sp_Log
CREATE PROC
脚本以将其恢复为原始定义。我不想从正在测试的 SQL Server 数据库项目中剪切和粘贴 sp_Log CREATE PROC
,因为我确信 CREATE PROC
的两个版本(在 SQL Server 数据库项目和单元测试项目中)会得到不同步。
有什么方法可以从单元测试项目中的测试后脚本调用 SQL Server 数据库项目中的sp_Log CREATE PROC
脚本?
或者,有没有办法在预测试脚本中记录sp_log
的定义,然后在后测试脚本中重新运行该定义?例如。是否可以在预测试脚本中创建一个局部变量并将存储过程的定义读入其中,然后在后测脚本中从局部变量中读回定义?
【问题讨论】:
【参考方案1】:只是为了确认重命名技术有效,实际上我在帖子中对其进行了演示:
https://tangodude.wordpress.com/2014/02/08/ssdt-database-projects-mocking-database-objects-for-isolated-unit-testing-kind-of/
对不起,多余的答案,但还没有足够的代表发表评论。 :)
【讨论】:
无需道歉,我认为这是一篇出色的博客文章,它解释了如何在测试失败时解决正确清理的问题。 顺便说一句:我注意到,除了添加链接之外,*** 礼仪似乎更倾向于在您的 *** 答案中引用或解释相关信息。这样,如果链接到的页面曾经更改地址或被删除,*** 答案仍然可以独立存在。不确定在这种情况下是否可行,因为您最终可能只是将整个博客文章粘贴到您的答案中,但将来知道它可能会很有用。 好的,我试试。感谢您的建议,我仍然是SO的新手,所以仍在学习。 :)【参考方案2】:尝试在测试前脚本中重命名sp_log
,然后在测试后脚本中重新命名。
预测试:
EXEC sp_rename 'sp_log', 'sp_log_BACKUP'
CREATE PROCEDURE sp_log AS .... /* your mock sp_log */
后测
EXEC sp_rename 'sp_log_BACKUP', 'sp_log'
我不确定在变量或类似内容中引用存储过程定义的方法。希望按照我的建议重命名存储过程就足够了。
【讨论】:
警告任何其他考虑这样做的人:如果测试失败,则似乎测试后脚本不会运行。因此,您可能会留下一个损坏的数据库。我认为您必须编辑自动生成的 .NET 测试代码,以确保即使测试条件失败,测试后脚本也能运行。当测试条件失败时,它似乎会引发异常,从而阻止执行其余的 .NET 测试代码。 @SimonTewsi 您可以通过编辑 C# 单元测试代码来修复代码以确保测试后脚本始终运行 - 您只需将测试操作包装在 try/finally 块中。这实际上将在 SSDT 的未来版本中得到修复。完整解释请参见 SSDT 论坛上的这篇文章:social.msdn.microsoft.com/Forums/sqlserver/en-US/… @Kevin:谢谢。阅读 Microsoft 关于如何解决该问题的建议很有用。【参考方案3】:为了确保您的数据库在测试执行后保持相同状态,我在事务中执行它。通过这样做,我无需担心在测试执行后清理数据库。您可以在此处找到更多详细信息:http://msdn.microsoft.com/en-us/library/aa833153(v=vs.100).aspx
【讨论】:
以上是关于Visual Studio 2013:单元测试 SQL Server 数据库项目时模拟存储过程的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Visual Studio 2013 中运行单元测试
在 Visual Studio 2013 中使用 HttpClient 进行单元测试/集成测试 Web API
Visual Studio 2013:单元测试 SQL Server 数据库项目时模拟存储过程