从“步骤定义”调用“步骤”时,如何解决“对象引用”错误

时间:2014-11-20 15:18:43

标签: c# specflow

我想从一些步骤定义的specflow中调用一些步骤。

问题是“给定(”我运行一个有用的步骤“);”不起作用。我收到错误:

非静态字段,方法或属性需要对象引用TechTalk.SpecFlow.Steps.Given(string)

但我正在做它在维基上所说的内容。

这是我的设置:

[Binding]
public class Utility_Subtests:Steps
{

    [Given(@"I run a useful step")]
    public void IRunAUsefulStep()
    {
        //Some useful things
    }

    [When(@"I want to use a useful step")]
    public void IWantToUseAUsefulStep()
    {
        Given("I run a useful step");
    }

}

我不明白为什么这不起作用,因为它与示例中显示的几乎完全相同。

更新:

我通过删除某个方法中的“静态”解决了这个问题。傻我。

更新2:更多信息

所以基本上在每个功能之前,我想运行将登录到我们的交易系统并删除公司的代码,然后恢复它。我已经有了“步骤”,所以我只想在BeforeFeature方法中调用这些步骤。

我可以调用方法......但是我无法使用:string attribute = ScenarioContext.Current.CurrentScenarioBlock.ToString();因为它不在场景上下文中,如果它在特征之前运行它是有意义的。

这是我的典型测试步骤之一:

    [When(@"I ICE to the test account: ""(.*)""")]
    public static void Subtest_IICEToTestAccount(string iceAccount)
    {
        try
        {
            OpenVMSDriver.SendShellCommand("ICE SET " + iceAccount);
        }
        catch (Exception ex) { TestDriver.CatchNTrash(ex); }
        string attribute = ScenarioContext.Current.CurrentScenarioBlock.ToString();
        string attrValue = Utility.GetAttributeValue(attribute);
        TestDriver.ResultsLog.LogSubTest(attribute + " " + attrValue.Replace("(.*)",iceAccount));
    }

这样做是向VMS发送命令并给我一个发生了什么的日志。为了获得一些不错的细节,我捕获当前的场景块,然后读取属性的值并将其写入日志。

问题是如果我这样调用这个方法:Subtest_IICEToTestAccount(“Faster”);

我无法读取他们会抛出异常的当前属性。

所以我想使用When(“I ICE to the test account:FASTER”);但是我在标题中得到了错误。也许这不是最好的方法,我应该编写一个方法来处理删除和恢复公司的所有步骤。

2 个答案:

答案 0 :(得分:0)

您应该将其更改为

[Binding]
public class Utility_Subtests:Steps
{

    [Given(@"I run a useful step")]
    public void IRunAUsefulStep()
    {
        //Some useful things
    }

    [Given(@"I run a useful step")]
    [When(@"I want to use a useful step")]
    public void IWantToUseAUsefulStep()
   {

    }

}

答案 1 :(得分:0)

这也感觉像是代码味道。为什么要在Given步骤中运行When步骤?即使这是额外的代码行,也要将GivenWhenThen步骤完全分开:

Scenario: I test something useful
    Given I run a useful step                  # 1. Set up
    When I want to use a useful step           # 2. Act
    Then something useful should have happened # 3. Assert

如果您想在没有When I want to use a useful step提供的测试设置的情况下使用Given I run a useful step该怎么办?

如果每次确实需要某个Given运行,则可能需要使用场景背景来组织场景:

Scenario Background:
    Given I run a useful step                  # 1. Set up

Scenario: I test something useful
    When I want to use a useful step           # 2. Act
    Then something useful should have happened # 3. Assert