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

本文关键字:调用 对象引用 错误 定义 何解决 解决 | 更新日期: 2023-09-27 18:31:08

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

问题是线路Given("I run a useful step");不起作用。我收到错误:

An object reference is required for the non-static field, method, or property `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");,但我在标题中遇到了错误。也许这不是最好的方法,我应该编写一个处理删除和恢复公司的所有步骤的方法。

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

你应该把它改成

[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()
   {
    }
}

这也感觉像是代码气味。为什么要在When步骤中运行Given步骤?即使它是额外的代码行,也要保持您的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

如果您想在没有Given I run a useful step提供的测试设置的情况下使用When I want to use 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