Specflow 步骤定义继承

2024-04-01

我有 ExcelStepDefinition 类,其中是我的 Excel 测试步骤。我也有 WordStepDefinition 类。由于这两个类有大量相同的步骤,因此我创建了一些 StepDefinition 类,它将作为这两个类的基类。

在这个基类中,我需要在构造函数中有一些参数,这取决于实例化的类(excel 或 word)。我已经完成了所有这些,但是当我在 Nunit 中开始测试时,它失败并显示以下堆栈跟踪:

System.IndexOutOfRangeException : Index was outside the bounds of the array.
TearDown : System.IndexOutOfRangeException : Index was outside the bounds of the array.
at TechTalk.SpecFlow.ScenarioContext.GetBindingInstance(Type bindingType)
at TechTalk.SpecFlow.ScenarioContext.GetBindingInstance(Type bindingType)
at lambda_method(ExecutionScope )
at TechTalk.SpecFlow.Bindings.MethodBinding.InvokeAction(Object[] arguments, ITestTracer testTracer, TimeSpan& duration)
at TechTalk.SpecFlow.TestRunner.FireEvents(BindingEvent bindingEvent, IEnumerable`1 tags)
at TechTalk.SpecFlow.TestRunner.FireScenarioEvents(BindingEvent bindingEvent)
at TechTalk.SpecFlow.TestRunner.OnScenarioStart(ScenarioInfo scenarioInfo)
at ABZ.ExcelTest.DisplayValueOfLinkedItemUsingFormattingRulesDefinedForAGivenLanguageFeature.ScenarioSetup(ScenarioInfo scenarioInfo) in D:\Projects\VS2008\ABZ\ABZ Report Office\ABZ.ExcelTest\ExcelSwitchLanguage.feature.cs:line 0
at ABZ.ExcelTest.DisplayValueOfLinkedItemUsingFormattingRulesDefinedForAGivenLanguageFeature.DisplayFactValueWithFormattingDefinedInSelectedLanguage(String cell, String column, String label, String lang, String cellValue) in d:\Projects\VS2008\ABZ\ABZ Report Office\ABZ.ExcelTest\ExcelSwitchLanguage.feature:line 23
--TearDown
at TechTalk.SpecFlow.ScenarioContext.GetBindingInstance(Type bindingType)
at TechTalk.SpecFlow.ScenarioContext.GetBindingInstance(Type bindingType)
at lambda_method(ExecutionScope )
at TechTalk.SpecFlow.Bindings.MethodBinding.InvokeAction(Object[] arguments, ITestTracer testTracer, TimeSpan& duration)
at TechTalk.SpecFlow.TestRunner.FireEvents(BindingEvent bindingEvent, IEnumerable`1 tags)
at TechTalk.SpecFlow.TestRunner.FireScenarioEvents(BindingEvent bindingEvent)
at TechTalk.SpecFlow.TestRunner.OnScenarioEnd()
at ABZ.ExcelTest.DisplayValueOfLinkedItemUsingFormattingRulesDefinedForAGivenLanguageFeature.ScenarioTearDown() in D:\Projects\VS2008\ABZ\ABZ Report Office\ABZ.ExcelTest\ExcelSwitchLanguage.feature.cs:line 0

以下是基类和派生类(仅定义和构造函数):

// base class
[Binding]
    public class StepDefinition : Steps
    {
        IOfficeAppDriver officeAppDriver ;
        public StepDefinition(IReportFactoryAddInGuiElements repo, string application)
        {
            officeAppDriver = new OfficeAppDriver(new ReportFactoryOfficeAddInDriver(repo), application);
        }

// derivded one
[Binding]   
    public class ExcelStepDefinition : StepDefinition
    {          
        IExcelDriver excelDriver;
        public ExcelStepDefinition() : base(new Excel2007Repository(), "excel")
        {
            excelDriver = new ExcelDriver(officeAppDriver.ReportFactoryOfficeAddInDriver, factReader);          
        }

也许这个构造函数中不可能有参数,我尝试没有它们并且它通过了。

你知道如何解决这个问题吗?


-- 这是来自的副本我在 SpecFlow Googe Group 上的回答 http://groups.google.com/group/specflow/browse_frm/thread/8c37ba399a19489d --

我认为这里有一个误解。

我认为按照您提出的方式使用继承是没有意义的。 与传统的 xUnit 测试框架相比,SpecFlow 的工作方式有很大不同。 在 SpecFlow 中,步骤定义是全局的。步骤定义没有 驻留在基类中以便可以从子类中使用。步 定义与 xUnit 测试装置中的方法不可比较 构架。

通常所有用 [Binding] 属性修饰的类 由 SpecFlow 扫描以发现步骤定义。 找到的所有步骤定义都可以在运行时使用 SpecFlow 解析并执行功能。 对于 SpecFlow 查找匹配的步骤定义,它与以下内容无关: 定义的步骤是哪个类定义的。

然而,当 SpecFlow 找到匹配的步骤定义时,它需要 能够实例化定义它的类。所以 包含步骤定义的类不能是抽象的。 该实例主要用于在相关步骤之间传递状态 定义(但是还有其他可能性来传递状态)。

钩子也是如此(Before .../ After ...):它们是全局的, 在运行时,它们定义在哪个类上并不重要。

以上是一般概念。 当我们开始考虑范围步骤时,事情变得有点复杂: 步骤定义的范围可以是标签和场景,挂钩可以是 范围为标签。

例子:
https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedStep/ScopedStepsBindings.cs https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedStep/ScopedStepsBindings.cs
https://github.com/techtalk/SpecFlow-Examples/blob/master/ASP.NET-MVC/BookShop/BookShop.AcceptanceTests.Selenium/Support/SeleniumSupport.cs https://github.com/techtalk/SpecFlow-Examples/blob/master/ASP.NET-MVC/BookShop/BookShop.AcceptanceTests.Selenium/Support/SeleniumSupport.cs

在这里阅读更多内容:
http://groups.google.com/group/specflow/browse_frm/thread/080c531cb17c86e0/5350665da2544871?#5350665da2544871 http://groups.google.com/group/specflow/browse_frm/thread/080c531cb17c86e0/5350665da2544871?#5350665da2544871

在 Cucumber wiki 上阅读更多内容。
关于全局步骤:
https://github.com/cucumber/cucumber/wiki/Feature-Coupled-Steps-(反模式 https://github.com/cucumber/cucumber/wiki/Feature-Coupled-Steps-(Antipattern)
步骤组织:
https://github.com/cucumber/cucumber/wiki/Step-Organization https://github.com/cucumber/cucumber/wiki/Step-Organisation

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Specflow 步骤定义继承 的相关文章

随机推荐

  • 将 HTML5 画布转换为 SVG 的方法?

    我需要将 HTML5 画布转换为 SVG 进行编辑 我怎样才能实现这个目标 Try canvas2svg js https github com gliffy canvas2svg Demo http gliffy github io ca
  • RStudio Shiny 动态选择

    在我的 RStudio Shiny 中 我得到了我的selectInput在我里面server R 以及关于ui R我有一个tags语句来更改选择框的宽度和高度 它在页面加载时起作用 但当我进入单一类型时它会恢复为默认大小 有什么想法如何解
  • 您正在使用 X509TrustManager 的不安全实现

    我在 Google Play 中有一个应用程序 今天我收到一封来自 Google 的邮件 内容如下 Google Play 警告 您正在使用不安全的实现 X509信任管理器 它介绍了有关 SSL 证书问题以及解决该问题的方法 我是出于好奇才
  • Swift - 使用 CGContext 用手指绘图

    我正在尝试制作一个绘图应用程序 我有一个自定义 UIView class DrawView UIView var touch UITouch var lastPoint CGPoint var currentPoint CGPoint ov
  • Phonegap 代码作为 Web 应用程序

    我正在考虑重新使用我的phonegap html css 和js 代码作为网络应用程序 我将仔细检查并删除所有仅限移动设备的功能 目的是拥有一个提供一些移动应用程序功能的网络应用程序 我目前使用的移动设备功能很少 但我猜维护我的移动应用程序
  • 配置vscode json格式空间

    我想配置 vscode 以使用 2 个缩进空间 而不是默认情况下的 4 个缩进空间 来格式化我的 JSON 对象 我怎样才能做到这一点 将以下行粘贴到 VSCode 中的 settings json 中 然后就完成了 json editor
  • 使用 Xpath 比较属性值

    给定以下文档结构 我如何使用 Xpath 检查两个属性值是否匹配
  • 类型错误:无法 pickle _thread.lock 对象

    尝试使用共享队列同时运行两个不同的函数并收到错误 如何使用共享队列同时运行两个函数 这是 Windows 7 上的 Python 版本 3 6 from multiprocessing import Process from queue i
  • (播放 2.4)特征中的依赖注入?

    在play 2 4中 是否可以在trait中使用依赖注入 有例子吗 Thanks 我在这里谈论 Guice 的运行时 DI 因为它是 Play 使用的默认方法 其他 DI 方法或框架可能有所不同 不可能将依赖项注入到特征中 因为特征不可实例
  • 查看 sp_execute 正在做什么

    在我的 MS SQL Profiler 中 我看到很多这样的小查询 执行 sp execute 1 p0 15954 我知道从理论上讲这是可行的 这是执行先前创建的查询并传入特定参数 但问题是我不确定是什么原因导致这些查询 有没有办法查看这
  • 如何避免使用 KITKAT 4.4.2 版本的 SD 卡上出现“EACCES 权限被拒绝”的情况。谷歌的新政策

    android kitkat 4 4 2 版本是针对 writeaccess 实现的新的 google 策略 到目前为止我还不明白 我在其他应用程序中读到了很多有关此问题的信息 他们收到 EACCES 权限被拒绝 的消息 我的应用程序需要写
  • Proxifier 是如何工作的?

    如你所知Proxifier是一个程序 允许不支持通过代理服务器工作的网络应用程序通过 HTTPS 或 SOCKS 进行操作 它可以处理来自正在运行的应用程序的任何传输 我想知道它是如何做到这一点以及我如何写一个这样的 FreeCap htt
  • d3.按属性值选择

    我是 d3 的新手 我有这样的定义 node node enter append circle attr id function d return d id attr class node on mouseover mouseover no
  • java.util.Date(int,int,int) 已弃用 [重复]

    这个问题在这里已经有答案了 构造函数java util Date int int int 已弃用 有没有像Java一样简单设置日期的方法 执行此操作的未弃用方法是什么 Date date new Date 2015 3 2 执行此操作的未弃
  • 在应用程序启动时以模态方式呈现视图控制器

    我的应用程序有一个设置屏幕 如果满足某些条件 该屏幕应以模态方式呈现在根视图控制器上 我已经在 SO 和互联网上四处查看 到目前为止 关于如何执行此操作的最接近的答案在这里 AppDelegate rootViewController 和
  • 使用依赖注入和“完成”编写 Karma + Mocha 测试?

    在 mocha 中编写 Karma 单元测试最优雅的方法是什么 它既具有依赖注入又具有done 依赖注入 describe cows function it farts a lot inject function cow do stuff
  • 从绝对名称 C# 获取 URI/URL 的父名称

    给定一个绝对 URI URL 我想获取一个不包含叶部分的 URI URL 例如 给定http foo com bar baz html http foo com bar baz html 我应该得到http foo com bar http
  • 是否有可能(如何)在 Java 运行时获取方法引用的名称? [复制]

    这个问题在这里已经有答案了 我最近使用了很多方法引用和 lambda 并且想知道在运行时是否可以打印以屏幕 lambda 的源 即它的名称 只是出于调试原因 我认为可以使用反射 通过在 getName 中调用 getClass 来实现 但我
  • 将 Google Sheets 查询结果从一行拆分为两行

    我想带着我的QUERY结果并将一个单元格 H 描述 移动到每个结果的下一行 I found 这个答案 https stackoverflow com questions 56420002 how to automatically split
  • Specflow 步骤定义继承

    我有 ExcelStepDefinition 类 其中是我的 Excel 测试步骤 我也有 WordStepDefinition 类 由于这两个类有大量相同的步骤 因此我创建了一些 StepDefinition 类 它将作为这两个类的基类