Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对远程存储过程进行单元测试_C#_Sql Server_Unit Testing_Stored Procedures - Fatal编程技术网

C# 如何对远程存储过程进行单元测试

C# 如何对远程存储过程进行单元测试,c#,sql-server,unit-testing,stored-procedures,C#,Sql Server,Unit Testing,Stored Procedures,我要在数据访问层上做单元测试,所有的数据访问层通过存储过程调用数据库。 我计划创建一个用于单元测试的干净数据库,但我发现大多数存储过程都会远程调用另一个数据库,我不知道如何对这种存储过程进行单元测试,我应该创建所有相关的数据库吗?还是其他解决方案?研究对象模拟 Rhino mocks是解决这个问题的一种方法,您可以开始研究它 模拟将允许您模拟从数据库访问数据,而无需实际设置“测试”数据库。设置模拟需要一点工作,但它可以保持测试的一致性。查看对象模拟 Rhino mocks是解决这个问题的一种方

我要在数据访问层上做单元测试,所有的数据访问层通过存储过程调用数据库。
我计划创建一个用于单元测试的干净数据库,但我发现大多数存储过程都会远程调用另一个数据库,我不知道如何对这种存储过程进行单元测试,我应该创建所有相关的数据库吗?还是其他解决方案?

研究对象模拟

Rhino mocks是解决这个问题的一种方法,您可以开始研究它


模拟将允许您模拟从数据库访问数据,而无需实际设置“测试”数据库。设置模拟需要一点工作,但它可以保持测试的一致性。

查看对象模拟

Rhino mocks是解决这个问题的一种方法,您可以开始研究它


模拟将允许您模拟从数据库访问数据,而无需实际设置“测试”数据库。设置模拟需要一点工作,但它可以保持测试的一致性。

一般来说,从应用程序的其余部分抽象出的数据访问层越多,单元测试就越好。正如Jayden在另一个答案中所写的那样,双重测试(如动态模拟)是一个很好的解决方案

然而,正如我理解您的问题,您明确地希望对数据访问层进行单元测试,这也没关系。在这种情况下,动态模拟将不会对您有所帮助,因为您将测试应用程序中的最低层——没有什么可以模拟的了。有些人坚持认为这不是一个单元测试,而是一个集成测试,但我认为重要的部分是测试是否是自动化的,而不是我们所说的

在任何情况下,一旦开始测试数据访问层,您或多或少都必须按原样处理它。如果它使用远程存储过程,那么您也必须处理它。为了简化设置,您可能希望将“远程”数据库与“本地”数据库放在同一个框中


单元测试主要是一种行为测试,这样就可以了。应该有其他类型的测试集成测试或系统测试,使用具有许多分布式机器等的实际设置来验证安全性、网络等是否按预期工作,但这不应该是单元测试的主要重点。

一般来说,从应用程序的其余部分抽象出的数据访问层越多,单元测试就越好。正如Jayden在另一个答案中所写的那样,双重测试(如动态模拟)是一个很好的解决方案

然而,正如我理解您的问题,您明确地希望对数据访问层进行单元测试,这也没关系。在这种情况下,动态模拟将不会对您有所帮助,因为您将测试应用程序中的最低层——没有什么可以模拟的了。有些人坚持认为这不是一个单元测试,而是一个集成测试,但我认为重要的部分是测试是否是自动化的,而不是我们所说的

在任何情况下,一旦开始测试数据访问层,您或多或少都必须按原样处理它。如果它使用远程存储过程,那么您也必须处理它。为了简化设置,您可能希望将“远程”数据库与“本地”数据库放在同一个框中


单元测试主要是一种行为测试,这样就可以了。应该有其他类型的测试集成测试或系统测试,使用一个具有许多分布式机器的现实设置来验证安全性、网络化等的工作,但这不应该是单元测试的主要焦点。

< p>您可以考虑构造引用另一个的数据库,这样所有远程表都可以通过视图访问。我通常遵循以下命名约定:

vw_[DATABASENAME]_[TABLENAME]
该视图只包含以下内容:

select * from server.dbo.tablename
所有存储过程都通过视图访问远程表,而不是直接访问远程数据库中的Person表call Staff:

create view vw_STAFF_Person
as

select * from Staff.dbo.Person

go

create procedure stp_Select_Staff
as

select * from vw_Staff_Person

go
而不是

create procedure stp_Select_Staff
as

select * from Staff.dbo.Person

go
这样做的理由是,当您想要测试您的数据库时,您可能需要将所有远程数据库重新链接到您的“测试”远程数据库。当访问远程数据的唯一对象是简单视图,而不是通常数量更多、更复杂的存储过程时,这通常更容易实现

我通常设置了一个作业,可以将视图重新写入“测试”数据库,因此它是自动完成的

除此之外,我还经常设置一项工作,将生产数据库备份恢复到“测试”环境,以便在部署前对包含实时数据副本的系统进行测试。同样,只需将视图重新链接,而不必将所有存储的过程引用重新链接到远程系统,就可以简化此过程

为了针对安全ea进行测试 sier,我还始终将数据库安全设置为数据库角色级别,而不是特定用户级别,因为我发现角色在生产、测试和开发环境中比用户更具可移植性


<>希望这些提示有帮助。

可以考虑构造引用其他数据库的数据库,以便所有远程表都可以通过视图访问。我通常遵循以下命名约定:

vw_[DATABASENAME]_[TABLENAME]
该视图只包含以下内容:

select * from server.dbo.tablename
所有存储过程都通过视图访问远程表,而不是直接访问远程数据库中的Person表call Staff:

create view vw_STAFF_Person
as

select * from Staff.dbo.Person

go

create procedure stp_Select_Staff
as

select * from vw_Staff_Person

go
而不是

create procedure stp_Select_Staff
as

select * from Staff.dbo.Person

go
这样做的理由是,当您想要测试您的数据库时,您可能需要将所有远程数据库重新链接到您的“测试”远程数据库。当访问远程数据的唯一对象是简单视图,而不是通常数量更多、更复杂的存储过程时,这通常更容易实现

我通常设置了一个作业,可以将视图重新写入“测试”数据库,因此它是自动完成的

除此之外,我还经常设置一项工作,将生产数据库备份恢复到“测试”环境,以便在部署前对包含实时数据副本的系统进行测试。同样,只需将视图重新链接,而不必将所有存储的过程引用重新链接到远程系统,就可以简化此过程

为了使针对安全性的测试更容易,我还始终将数据库安全性设置为数据库角色级别,而不是特定用户级别,因为我发现角色在生产、测试和开发环境中比用户更易于移植


希望这些提示能有所帮助。

+1否定-1有人给出了这个答案,但没有留下任何评论。Jayden是对的,尽管我会使用Moq:-如果您使用的是数据库,那么您没有进行纯粹的单元测试。您可能希望在DAL上执行集成测试,这没关系。对于您的测试数据库,只需将实际存储过程替换为返回静态数据的存根存储过程。+1可否定-1,有人给出了这个答案,但没有留下任何注释。Jayden是对的,尽管我会使用Moq:-如果您使用的是数据库,那么您没有进行纯粹的单元测试。您可能希望在DAL上执行集成测试,这没关系。对于测试数据库,只需将实际存储过程替换为返回静态数据的存根存储过程。