在MVVM中为WPF使用specflow

在MVVM中为WPF使用specflow,wpf,mvvm,specflow,Wpf,Mvvm,Specflow,我第一次尝试使用specflow来实现具有MVVM模式的WPF项目。所以,我有存储库、控制器、视图和视图模型。存储库调用webservice,webservice点击数据库并返回数据。视图模型具有验证用户输入和调用存储库方法的方法 在我的specflow中,我应该进行包括存储库方法在内的完整调用,还是应该使用Moq模拟这些方法?这有意义吗?简短的回答: 您可以让您的调用命中数据库,但我建议将其模拟掉,除非您的数据库中有逻辑 答案很长: 对于这个问题有两种不同的看法。首先,您希望使用SpecFlo

我第一次尝试使用specflow来实现具有MVVM模式的WPF项目。所以,我有存储库、控制器、视图和视图模型。存储库调用webservice,webservice点击数据库并返回数据。视图模型具有验证用户输入和调用存储库方法的方法

在我的specflow中,我应该进行包括存储库方法在内的完整调用,还是应该使用Moq模拟这些方法?这有意义吗?

简短的回答: 您可以让您的调用命中数据库,但我建议将其模拟掉,除非您的数据库中有逻辑

答案很长: 对于这个问题有两种不同的看法。首先,您希望使用SpecFlow进行什么样的测试,其次,访问数据库有多容易

如果您使用SpecFlow来测试您的低级技术需求,那么您实际上是在按示例进行规范风格的单元测试。所以这真的应该规定你使用模拟来隔离你的单位。(就我个人而言,我坚持使用NUnit进行这些测试。)

但是,如果您使用SpecFlow测试您的业务场景(即验收测试),那么您的场景依赖于多个单元来提供功能。这更像是集成或系统测试,因此需要涉及许多组件。从理论上讲,因为我们正在测试整个系统,所以我们应该在其中包含一个DB,特别是如果您甚至有一个存储过程或视图,您可能希望稍后进行回归测试

然而,第二种看待这一点的方式是,要有一个可用于测试的数据库,需要付出多大的代价

  • 如果您的开发团队中不止一个人,那么如果您同时运行测试,您需要什么策略来避免失败?
    • 例如,您可以在每次运行中生成一个新的唯一客户,并且只访问针对该客户的更新和查询,这样您就不会得到错误数量的订单
  • 测试运行后,您将如何重置数据库?
    • 例如,如果您使用的数据库类型正确,您可以将空的.mdb检查到源代码管理中,然后回滚/恢复到该状态

我个人发现,对于没有存储过程和视图的简单DB,模拟更好,但一旦您将业务逻辑添加到DB中,您就需要以某种方式测试该逻辑。

在这种情况下,我使用specflow进行单元测试和功能测试。对于单元测试,specflow在给定语句中定义并设置测试用例的模拟数据,然后执行测试。对于功能测试,给定的语句定义了更多的用户输入,此外,我设置了一个单独的功能测试数据库,每天晚上都部署该数据库,这样specflow功能测试就可以自动运行。