- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正尝试在我的组织中采用 BDD,因为 C#.Net 是我们的主要开发模式,Specflow 是我们“任何 Cucumber”的最佳选择。
不过,我过去一直是 Spring 的狂热爱好者,但在我的公司,我们在应用程序的各个部分使用 Autofac。但是,我无法找到任何资源来解释“如何”使用 Autofac 来“触发”Specflow 的 BDD 测试并提供必要的依赖关系连接。
我计划让 Autofac 负责实例化、连接和执行一切,而不是执行 Specflow,并且让调用 Autofac 的方法随处可见,即使用 Autofac 作为服务定位器而不是 DI/IoC 容器。甚至可以做到这一点,还是我以错误的方式看待它并且有更好的方法来实现相同的目标?还是我应该完全依赖 Specflow 的“内部容器”进行 DI 而完全忘记 Autofac?
可能的方法:
优点/缺点:
我不确定如何实现它们中的任何一个,让 Specflow 处理 DI 而忘记 Autofac 还是让 Autofac 启动一切更好,或者是否有一些中间立场更好?
当前的 BDD 设置:Specflow、Selenium/PhantomJS、Xunit。希望与 Autofac 结合。
最佳答案
I plan to have Autofac be responsible for instantiating, wiring and executing everything instead of executing Specflow and have methods calling Autofac littered everywhere.
Visual Studio
运行你的测试或 ReSharper
(我假设你不想失去它)。Have Specflow globally instantiate Autofac which is wired with the necessary dependencies for the remainder of the code. Possible that step definitions may land up using Autofac as a factory to get what they need.
But this would lead to lots of calls to Autofac from within the step definitions coupling the two libraries together.
AutoFac
来解析步骤定义类中所需的类型。直接的方法。我会在基类中创建一个方法或将对象绑定(bind)到 specflow 的 mini DI Container说了方法。我要做的是创建一个名为 IServiceLocator
的服务定位器接口(interface)(是的,我知道 service locator is an antipattern )
public interface IServiceLocator
{
T Get<T>();
}
然后我们将使用 Autofac
创建此接口(interface)的实现(请记住,您可以将其替换为另一个实现)
public class AutoFacServiceLocator: IServiceLocator
{
private readonly IContainer _container;
public AutoFacServiceLocator(IContainer container)
{
_container = container;
}
public T Get<T>()
{
//Here you add your resolution logic
}
}
事实上,对于每个场景,我们都需要一个 IServiceLocator
的实例,我们希望能够通过Specflow
得到它的 Context Injection
.
[Binding]
public class Hooks
{
private readonly IObjectContainer _objectContainer;
public Hooks(IObjectContainer objectContainer)
{
_objectContainer = objectContainer;
}
[BeforeScenario]
public void RegisterServiceLocator()
{
var container = CreateContainer();
var serviceLocator = new AutoFacServiceLocator(container);
_objectContainer.RegisterInstanceAs<IServiceLocator>(serviceLocator);
}
private IContainer CreateContainer() { /*Create your container*/}
}
最后是用法
[Binding]
public class Steps
{
private readonly IServiceLocator _serviceLocator;
public Steps(IServiceLocator serviceLocator)
{
_serviceLocator = serviceLocator;
}
[Given(@"I have entered (.*) into the calculator")]
public void GivenIHaveEnteredIntoTheCalculator(int p0)
{
Foo foo = _serviceLocator.Get<Foo>();
}
}
更新:
travis-illig在下面的评论中说
If you go with service location, try CommonServiceLocator rather than creating your own interface
我真的不认为有必要使用 CommonServiceLocator
.对服务定位器的调用应该与 Controller 中的构造函数注入(inject)相匹配,这意味着这些调用应该被方法 Get<T>()
覆盖。 .
Quoting ctavares , CommonServiceLocator
之一的开发者
Should I use this library for my applications?
Typically, the answer to this question is no. Once you've decided on a container that suits your project, there's not a whole lot of benefit from writing your whole application in a way that can switch containers. For libraries that must fit into other ecosystems and play nicely with other libraries, it's an important feature, but for applications the extra layer of abstraction really doesn't buy you much.
CommonServiceLocator
适用于库和框架,因为 PhD的测试项目是他和他的团队的我不建议引入更多依赖项。
关于c# - (如何)可以使用 Autofac 作为 IoC 容器运行 Specflow 测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32387332/
在 Visual Studio 中,当我输入特征文件时,如果该步骤尚不存在,它会突出显示。我想知道是否有可以在命令行中为 specflow 项目编写的命令,它可以为我提供已存在的所有步骤的列表? 最佳
场景大纲对于创建数据驱动的测试非常方便,但是场景的数量会随着示例的数量而增加。我已经养成了标记场景的习惯,以便更容易过滤我们应用程序的主要功能。 我想设置一个适用于所有主要用例的“冒烟测试”。其中一些
有没有办法用“显式”属性标记 Specflow 测试?我知道可以通过使用特殊标签@ignore 用“忽略”属性标记测试。 最佳答案 也许。 如果您查看生成的 xxx.feature.cs,您会看到它被
简而言之,我需要的是创建一个具有可重复步骤的场景大纲,而不必像我目前在下面所做的那样使用多个 AND 输入它: Scenario Outline: outline Given I am a u
如何在表格中传递空格? Background: Given the following books |Author |(here several spaces)
我有一个如下所示的 Specflow 场景 Scenario: I Shoot a gun When I pull the trigger Then It should expel a bullet
我想在 SpecFlow 功能中添加一些评论。 我收到以下错误: Custom tool error: Parsing error near '/*' 我尝试过以下方法: // comment /*
我从Techtalk了解到将步骤定义与特征耦合是一种反模式。不过,我想知道如何组织我的步骤定义,以便我可以在代码中轻松查看哪些步骤是一起进行的。 例如,我应该为每个功能创建一个代码文件,并为共享的步骤
我正在重构我们的 SpecFlow 实现的 BDD 测试。作为这项工作的一部分,我注释掉了大部分步骤定义。 当我运行测试时,我看到“未找到一个或多个步骤的匹配步骤定义”。消息。 但是,我不想等到测试实
如何配置 SpecFlow,使其不将计时信息显示为测试文本的一部分,例如 -> done: Steps.ThenIWillBeDeniedAccess() (0.0s) 干杯。贾斯。 最佳答案 结果我
我正在使用 SpecFlow 进行一些 BDD 式测试。我的一些功能是 UI 测试,所以他们使用 WatiN。有些不是 UI 测试,所以它们不是。 目前,我有一个 StepDefinitions.cs
我正在使用 SpecFlow,我想编写如下所示的场景: Scenario: Pressing add with an empty stack throws an exception Given
我的项目非常大,并且有大量的测试步骤。结果,当我编写“功能”文件时,我发现我的计算机停止了运转。在非常大的功能文件上,即使不输入任何内容,我的一个 CPU 内核也会最大化,并且性能会下降到输入非常滞后
如果您运行足够多次,我的 SpecFlow 测试会失败。如何进行现有的 SpecFlow 测试并使其运行无限次直到失败? (理想情况下,我想计算需要多少次。) 我最初的猜测是只调用测试脚本最终调用的绑
我已经编写了我希望在运行 specflow 测试之前执行的代码,以设置所有测试都需要的各种全局变量: namespace MyProject.IntegrationTest { public
我尝试使用 Specflow 编写一些功能。不幸的是,通过以下 URL 安装后,我无法在系统中的任何地方找到 techtalk.specflow.dll。 http://visualstudiogal
这是我们的验收测试之一的示例: Feature: Add an effect to a level In order to create a configuration As a user I wan
在我的功能文件中,IntelliSense 说有一个关键字叫 Scenarios .注意是复数。我已经倾注了documentation并且找不到任何对它的引用。任何人都可以解释它的用途以及如何使用它?
我们在我当前的项目中使用了 Specflow 和 WatIn 进行验收测试。客户希望我们改用 Microsoft coded-ui。我从未测试过编码的 ui,但从我目前看到的情况来看,它看起来很麻烦。
我希望能够在本地执行给定的 SpecFlow (Gherkin) .feature 文件,而无需进行编译。 因此工作流程将是(作为业务分析师或 QA 工程师): 1.修改.feature文件(使用预定
我是一名优秀的程序员,十分优秀!