2016-03-01 58 views
-2

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

更新: 我的web服务正在被一个已建立的产品使用,使得在分离DAL之后很难执行构造函数依赖注入。

+0

将你的数据访问抽象成一个从接口继承的存储库。然后,您可以使用该界面创建可测试的模拟回购,但不会触及您的实际数据库。 –

回答

0

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

您要测试的代码,需要从上面的代码和下面的代码中分离出来。然后,对于每个场景或方法,您准备一个测试,它将验证在此测试案例中,对于预期的输入数据,您将获得预期的输出数据。

+0

我已经有一个使用Web服务的已建立的图层。如果我创建一个实现接口并使用依赖注入的DAL,我将不得不更改服务类的构造函数以使用它。这样我可以在从测试类调用时模拟接口。如果我错了,我很抱歉,因为我对编程世界很陌生。 –

+0

我会建议使用静态服务定位器,或者在这种情况下使用数据访问定位器。 Di在此定位器中处理,并且您始终使用静态资源。如果您使用泛型创建一个通用定位器,则可以将其重复用于多个模拟场景。 – user853710

+0

当你想要一个ServiceMock的时候,你可以从定位器中获得它,如果你需要真正的服务,它也是一样。与DAL一样。重要的是你总是使用两个版本都会实现的接口。泛型会很好地处理这个问题 – user853710

0

你一定要改变你的DAL来单元测试这个。你的单元测试不应该触及数据库,你应该创建一个存储库或其他抽象,你可以在你的测试中模拟。

+0

如果我创建一个实现接口并使用依赖注入的DAL,我将不得不更改服务类的构造函数以使用它。这样我可以在从测试类调用时模拟接口。如果我错了,我很抱歉,因为我对编程世界很陌生。 –

+0

是的,这听起来正确。无论如何,您需要一些将服务的接口作为构造函数的依赖项的类。然后,您可以在测试中模拟服务依赖关系,并测试其周围的所有其他代码。 – andreasnico

+0

我已经有一个使用Web服务的已建立图层。如果我更改构造函数以将接口作为参数,我将如何使用Web服务。我需要更改服务正在使用的代码? –

0

所以有两种类型的测试我认为你可能会感到困惑。单元测试只是您可以测试的特定功能,不应该依赖外部系统。您可以执行集成测试,因为Web服务与此数据库紧密耦合。这将需要重构数据库功能并嘲笑对它的调用,以便能够正确地测试服务。一旦你这样做了,MSDN就如何正确地单元测试一个Web服务已经有了一些步骤:https://msdn.microsoft.com/en-us/library/ms243399(v=vs.100).aspx