【问题标题】:unit testing asp.net web services web methods having direct connection to database [closed]单元测试具有直接连接到数据库的asp.net Web服务Web方法[关闭]
【发布时间】:2016-03-01 12:41:51
【问题描述】:

我有一个具有 [WebMethod] 的 asp.net Web 服务服务层。这些 web 方法具有连接字符串并且正在修改 dev db。没有单独的数据访问层。 WebMethods 正在通过存储过程修改数据库。我想使用 nunit 对这些 web 方法进行单元测试。但是在不修改数据库的情况下无法找到一种方法。我愿意修改我的服务层,以便完全分离数据访问层,然后对其进行单元测试。任何有助于做这些事情的良好做法的线索将不胜感激。

更新: 我的 web 服务正被一个成熟的产品使用,因此在分离 DAL 后很难进行构造函数依赖注入。

【问题讨论】:

  • 将您的数据访问抽象到从接口继承的存储库中。然后,您可以使用该接口创建一个可测试但不会影响您的实际数据库的模拟存储库。

标签: c# asp.net unit-testing nunit


【解决方案1】:

解决方案直接在于单元测试的理论。您创建一个实现接口的数据访问层,并使用依赖注入在运行场景中使用真实代码,并为测试场景使用模拟服务。

您要测试的代码,需要与上面的代码和下面的代码隔离。然后为每个场景或方法准备一个测试,该测试将验证在这个测试用例中,对于预期的输入数据,你是否获得了预期的输出数据。

【讨论】:

  • 我已经建立了一个使用网络服务的层。如果我创建一个实现接口并使用依赖注入的 DAL,我将不得不更改服务类的构造函数以使用它,对吗?这样我就可以在从测试类调用时模拟接口。如果我错了,我很抱歉,因为我对编程世界很陌生。
  • 我建议使用静态服务定位器,或者在这种情况下使用数据访问定位器。 Di 在此定位器中处理,您始终使用静态资源。如果您使用泛型创建通用定位器,则可以在多个模拟场景中重用它。
  • 当你想要一个 ServiceMock 时,你会从定位器中得到它,如果你需要真正的服务也是一样的。与 DAL 相同。重要的是您始终使用两个版本都将实现的接口。泛型会很好地处理这个问题
  • 这解决了我的问题。非常感谢!
【解决方案2】:

您肯定必须更改您的 DAL 才能对此进行单元测试。您的单元测试不应涉及数据库,您应该创建一个存储库或其他一些抽象,您可以在测试中模拟它们。

【讨论】:

  • 如果我创建一个实现接口并使用依赖注入的 DAL,我必须更改服务类的构造函数才能使用它,对吗?这样我就可以在从测试类调用时模拟接口。如果我错了,我很抱歉,因为我对编程世界很陌生。
  • 是的,听起来很正确。无论如何,您需要一些将服务接口作为构造函数中的依赖项的类。然后你可以在你的测试中模拟服务依赖,并测试它周围的所有其他代码。
  • 我已经建立了一个使用网络服务的层。如果我将构造函数更改为将接口作为参数,我将如何使用 Web 服务。我需要更改使用服务的代码吗?
【解决方案3】:

所以有两种类型的测试,我认为您可能会感到困惑。单元测试只是您可以测试的特定功能,不应依赖外部系统。不过,您可以执行集成测试,因为 Web 服务与该数据库紧密耦合。为了能够正确测试服务,需要重构 DB 函数并模拟对它的调用。完成此操作后,MSDN 会提供有关如何正确对 Web 服务进行单元测试的步骤:https://msdn.microsoft.com/en-us/library/ms243399(v=vs.100).aspx

【讨论】:

    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多