2009-11-16 100 views
2

我们在.NET 3.5 \ C#和WCF中有一组服务。 NUnit测试需要服务运行并监听请求。 这些服务需要更新的SQL数据库才能连接。单元测试依赖于数据库的窗口服务

目前的单元测试的[设置]部分做两个任务:

  • 执行最新的SQL脚本来建立数据库。
  • 利用 System.Diagnostics.Process.Start运行服务的命令行模式。

它通常有效,但服务对某些模式更改很敏感,有时会使其失败。我正在寻找设置数据库和服务的最佳实践,并确保服务最终停止。

该过程由MSBuild运行。

回答

5

如果你启动服务,并实际执行服务......变化你不只是单元测试了。您现在正在进行集成测试。

你应该真的考虑将你的数据访问抽象为接口。然后,您可以编写该接口的具体实现以进行正常操作,并使用依赖注入为单元测试注入模拟实现。

+0

你能详细说明一下吗?我的意思是从理论到实践 - 我可以使用的任何示例? – KMoraz 2009-11-17 10:25:10

1

单元测试的最佳实践是使用仿真数据库行为而不是真实数据库的模拟对象。

1

您是否使用了依赖注入(DI)?

我强烈推荐阅读Jerry Millers blog,他在单元测试和使用.Net的DI方面有很多很棒的东西。

这是一篇文章,让您开始The Dependency Injection Pattern
一旦你读到这个,看看他的帖子Unit Testing Business Logic

使用MSBuild是一个好的开始,所以现在它是一个重新分解外部服务并在测试过程中嘲笑它们的例子。你想要嘲笑的复杂程度取决于你。

这是SO post on Mocking Frameworks为您开始。

我建议你的破测试分为两个独立的部分:

  • 单元测试(在那里你会用DI模拟出与外部服务)
  • 集成测试(目前你在做什么)

在测试结束时,您可以使用带有[TestFixtureTearDown]属性的方法来停止服务。