5

我正在将 SpecFlow 与 Nunit 一起使用,并且我正在尝试使用 TestFixtureSetUpAttribute 设置我的环境测试,但它从未被调用过。

我已经尝试使用 MSTests 和 ClassInitialize 属性,但同样的情况发生了。该函数未被调用。

任何想法为什么?

[Binding]
public class UsersCRUDSteps
{
    [NUnit.Framework.TestFixtureSetUpAttribute()]
    public virtual void TestInitialize()
    {
        // THIS FUNCTION IS NEVER CALLER

        ObjectFactory.Initialize(x =>
        {
            x.For<IDateTimeService>().Use<DateTimeService>();
        });

        throw new Exception("BBB");
    }

    private string username, password;

    [Given(@"I have entered username ""(.*)"" and password ""(.*)""")]
    public void GivenIHaveEnteredUsernameAndPassword(string username, string password)
    {
        this.username = username;
        this.password = password;
    }

    [When(@"I press register")]
    public void WhenIPressRegister()
    {
    }

    [Then(@"the result should be default account created")]
    public void ThenTheResultShouldBeDefaultAccountCreated()
    {
    }

解决方案:

[Binding]
public class UsersCRUDSteps
{
    [BeforeFeature]
    public static void TestInitialize()
    {
        // THIS FUNCTION IS NEVER CALLER

        ObjectFactory.Initialize(x =>
        {
            x.For<IDateTimeService>().Use<DateTimeService>();
        });

        throw new Exception("BBB");
    }

    private string username, password;

    [Given(@"I have entered username ""(.*)"" and password ""(.*)""")]
    public void GivenIHaveEnteredUsernameAndPassword(string username, string password)
    {
        this.username = username;
        this.password = password;
    }

    [When(@"I press register")]
    public void WhenIPressRegister()
    {
    }

    [Then(@"the result should be default account created")]
    public void ThenTheResultShouldBeDefaultAccountCreated()
    {
    }
4

1 回答 1

6

TestInitialize没有被调用,因为它在你的 Steps 类中而不是在单元测试中(因为实际的单元测试在从你的文件.cs生成的里面)。.feature

SpecFlow 有自己的测试生命周期事件,称为钩子,这些都是预定义的钩子:

  • [BeforeTestRun]/[AfterTestRun]
  • [BeforeFeature]/[AfterFeature]
  • [BeforeScenario]/[AfterScenario]
  • [BeforeScenarioBlock]/[AfterScenarioBlock]
  • [BeforeStep]/[AfterStep]

请注意,这为设置提供了更大的灵活性。有关其他信息,请参阅文档

基于您要使用该TestFixtureSetUp属性的事实,您可能需要BeforeFeature在每个功能之前调用一次的钩子,因此您需要编写:

[Binding]
public class UsersCRUDSteps
{
    [BeforeFeature]
    public static void TestInitialize()
    {               
        ObjectFactory.Initialize(x =>
        {
            x.For<IDateTimeService>().Use<DateTimeService>();
        });

        throw new Exception("BBB");
    }

    //...
}

请注意,该[BeforeFeature]属性需要一个static方法。

您还应该注意,如果您使用的是 VS 集成,则有一个名为的项目项类型SpecFlow Hooks (event bindings),它创建一个带有一些预定义挂钩的绑定类,以帮助您入门。

于 2012-11-02T09:51:35.717 回答