Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 场景之前的Specflow已被调用四次_Unit Testing_Nunit_Specflow - Fatal编程技术网

Unit testing 场景之前的Specflow已被调用四次

Unit testing 场景之前的Specflow已被调用四次,unit-testing,nunit,specflow,Unit Testing,Nunit,Specflow,我有一个解决方案,其中包含一组可以使用NUINT运行的测试。我正在尝试将specflow集成到其中: [TestFixture] [Binding] public class TestBase { protected IWindsorContainer Container {get; set; } protected IMongoCollectionManager CollectionManager { get; set; } protected IDatabaseMan

我有一个解决方案,其中包含一组可以使用NUINT运行的测试。我正在尝试将specflow集成到其中:

[TestFixture]
[Binding]
public class TestBase
{
    protected IWindsorContainer Container {get; set; }
    protected IMongoCollectionManager CollectionManager { get; set; }
    protected IDatabaseManager DatabaseManager { get; set; }

    [TestFixtureSetUp]
    [BeforeScenario,CLSCompliant(false)]
    public void Setup()
    {
        Container = TestFixture.Container;
        CollectionManager = Container.Resolve<IMongoCollectionManager>();
        DatabaseManager = Container.Resolve<IDatabaseManager>();
    }

    [TestFixtureTearDown]
    public void TearDown()
    {
        Container.Release(CollectionManager);
        Container.Release(DatabaseManager);

    }

}
[TestFixture]
[有约束力]
公共类测试库
{
受保护的IWindsorContainer容器{get;set;}
受保护的IMongoCollectionManager CollectionManager{get;set;}
受保护的IDatabaseManager数据库管理器{get;set;}
[TestFixtureSetUp]
[在场景之前,CLSCompliant(false)]
公共作废设置()
{
Container=TestFixture.Container;
CollectionManager=Container.Resolve();
DatabaseManager=Container.Resolve();
}
[测试固定器拆卸]
公共无效拆卸()
{
容器释放(CollectionManager);
容器发布(DatabaseManager);
}
}
每次我运行基本上只有一个场景的功能文件时,它都会执行四次before测试,甚至在它进入给定场景之前,但当我使用简单nuint运行它时,它工作正常,并且只被调用一次。 有人能帮我弄清楚为什么吗? 谢谢
Bijo

因为它们是由SpecFlow自动连接的,所以在step类中不需要这些NUnit属性:

[TestFixture]
[TestFixtureSetUp]
[TestFixtureTearDown]
我不确定您的功能中有多少个场景,但BeforeCasenario将在每个场景之前运行。如果希望代码在功能之前或之后运行一次,可以使用以下挂钩:

[BeforeFeature]
[AfterFeature]
[BeforeScenario]
[AfterScenario]
如果希望代码在功能中的每个场景之前或之后运行一次,可以使用以下挂钩:

[BeforeFeature]
[AfterFeature]
[BeforeScenario]
[AfterScenario]
此外,如果您的方法需要CLSCompliant(false),则应将其添加到自己的属性中:

[CLSCompliant(false)]

您可以查看SpecFlow文档,以获取有关上SpecFlow钩子属性的更多信息。

想到两件事:

  • 不要混合使用NUnit属性和SpecFlow属性。您可以通过将执行“工作”的代码包装到一个单独的类中,并从一个单独的挂钩/单元测试类(用它们的特定属性装饰)组合它来获得相同的效果

  • 当我多次执行beforecasenario时,这是由于specflow钩子中的继承。我相信这是因为属性被子类继承,并且base和sub都由specflow匹配


  • 您是在运行整个功能还是只运行一个场景?before场景将在每个场景之前运行,只运行一个场景。谢谢我对问题进行了编辑,使其更加清晰。正如下面的答案所说,您不应该使用NUnit属性,请将此问题留给specflow。这几乎肯定是你问题的原因。嗨,查尔斯和莫,谢谢你的回复。我知道在每个场景运行之前都会先运行场景,而且我确实有其他解决方案可以正常工作。这个新的解决方案只有一个场景开始,当我调试它时,这个场景将执行四次。我不确定原因。我还使用TestFixture相关属性来运行CI构建。基本上,我计划运行这个解决方案是因为需要将它们作为nunit测试运行,或者使用功能文件运行它们。@bijo:由功能文件生成的C#代码是nunit测试类。查看更多信息。您应该能够指定包含功能的程序集,并可以选择运行测试。查看SpecFlow功能文件的代码隐藏文件。