Specflow BeforeScenario被调用了四次

时间:2015-04-14 16:35:39

标签: unit-testing nunit specflow

我有一个解决方案,其中包含一组可以使用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);

    }

}

每次我运行基本上只有一个场景的特征文件时,它会执行前面的测试四次,然后它甚至会转到给定的场景,但是当我使用简单的nuint运行它时,它正常工作并且只被调用一次。 任何人都可以帮我找出原因吗? 谢谢, 美女

2 个答案:

答案 0 :(得分:2)

由于它们是由SpecFlow自动连接的,因此您不应在步骤类中使用这些NUnit属性:

[TestFixture]
[TestFixtureSetUp]
[TestFixtureTearDown]

我不确定您的功能中有多少场景,但BeforeScenario将在每个场景之前运行。如果您希望代码在功能之前或之后运行一次,则可以使用这些钩子:

[BeforeFeature]
[AfterFeature]

如果您希望代码在功能中的每个方案之前或之后运行一次,您可以使用这些钩子:

[BeforeScenario]
[AfterScenario]

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

[CLSCompliant(false)]

您可以查看SpecFlow文档以获取有关https://github.com/techtalk/SpecFlow/wiki/Hooks上的SpecFlow Hook属性的更多信息。

答案 1 :(得分:0)

有两件事让人想起:

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

  2. 当我多次执行BeforeScenario时,它是由于specflow挂钩中的继承造成的。我相信这是因为该属性由子类继承,base和sub都由specflow匹配。