从SpecFlow注入数据到运行IISExpress

时间:2015-04-30 15:19:11

标签: asp.net-mvc bdd iis-express specflow

我是ASP.NET MVC 5世界和SpecFlow的新手。我正在尝试将一个简单的例子放在一起用于学习目的。我在一个程序集中有一个ASP.NET MVC项目,在另一个程序集中有一个SpecFlow定义。我试图避免在设置中使用数据库,因为我正在努力保持这种轻量级。我想要做的是在MVC服务器上有一个内存中的数据对象集合,我可以从SpecFlow定义中进行操作。即我希望有这样的流程:

(1)在SpecFlow中我说的是

Given I have the following account data
  | Id  |  Balance | 
  | abc |   123    |

(2)然后,我希望SpecFlow绑定将新的Account对象注入到IISExpress进程上运行的内存中集合中。

(3)最后我想在SpecFlow中要求

Then when I view the account balance of 'abc' 
in the web browser I am shown a balance of '123'

...然后绑定将运行WatiN以使IE打开正确的URL并解析结果。

我缺少的是一种将数据注入正在运行的IISExpress的方法。我可以通过在MVC应用程序中对一些配置进行硬编码来解决问题,但这不是我正在寻求的动态测试解决方案。任何建议都感激不尽!

1 个答案:

答案 0 :(得分:1)

我知道这只是一种学习经历,但我会考虑这是否是一个真实的系统,你如何将它变成一个生产稳定的代码。这样你就有机会学到更多东西。

不幸的是,没有银弹会给你一个解决方案。事实上,你需要的东西可能比它最初看起来要复杂得多。

你需要,

  1. 提供公共界面的ASP.Net MVC服务器(假设您使用的是WaitiN我将假设它是一个网站)。这是你已经拥有的一点
  2. 一种配置和启动ASP.Net MVC服务器的方法,以便它与备用数据存储一起运行。我已经看到这些由主机名,环境变量或启动参数触发。从长远来看,所有这些都有问题,所以只需挑选适合的东西,并在出现问题时重新访问。
  3. 另一个界面(可能只是一个API,以及学习在ASP.Net MVC中开发JSON API的借口)来处理非生产操作,以确保您的数据存储在其中具有正确的状态。这可能是一个细粒度的东西,允许您设置帐户和余额(这将意味着在测试中的大量调用,以使数据进入其所需的状态),或更粗略的东西(即恢复的单个调用)它已经被称为“#34;状态”。
  4. 一种分离非生产操作的方法,以便它们在您的最终生产实例中不可用。你给出了一个有余额的账户的例子,想象一下如果有人发现他们可以将余额设定为所需价值的问题吗?就个人而言,我会找到某种方式来构建"你的系统,所以这个代码甚至没有进入生产领域,但如果安全性不那么重要,那么你可以简单地找到一种保护它的方法。
  5. 想要同时运行您的测试,因为您需要更多的测试并且需要更长时间才能运行?你有没有想过一种分离并行流的方法?也许每个测试都有自己的帐号?也许你想为每个测试运行一个单独的WebServer?
  6. 现在我道歉但是到目前为止我会让你质疑你的决定。上面我们讨论了从前到后测试所有问题的所有问题。它可以在验收测试中使用,或者作为回归测试使用,但它在学习如何做这些事情方面确实没有用。当您考虑业务流程时,SpecFlow的效果最佳。那么你需要你的测试来讨论网络浏览器吗? (快速阅读Whose domain is it anyway?

    如果您写了

    ,该怎么办?
    Then the account balance of 'abc' should be '123'
    

    现在你已完全抽象出UI,这是Subcutaneous testing。这将允许您避免在Web服务器中运行测试的需要,这将为您提供更容易的方式来注入假数据存储。

    你也可以写

    When I click on 'Check Balance' 
    Then it should call the 'CheckBalanceCommand'
    

    这将允许您仅测试UI层,并且可以使用 Mock -ed层替换Command层,以避免所有数据存储设置。

    事实上,您甚至可能想要考虑一种测试架构,例如   - UI - >命令   - 命令 - >商业逻辑   - 命令 - >数据存储

    或者您可能只想尝试一下大量的测试? : - )