Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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
C# 从步骤定义调用步骤时,如何解决对象引用错误_C#_Specflow - Fatal编程技术网

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

C# 从步骤定义调用步骤时,如何解决对象引用错误,c#,specflow,C#,Specflow,我想从一些步骤定义中调用specflow中的一些步骤 问题是,如果我运行了一个有用的步骤,那么这条线将是错误的;不起作用。我得到一个错误: An object reference is required for the non-static field, method, or property `TechTalk.SpecFlow.Steps.Given(string)`. 但我在做维基上说的事 以下是我的设置: [Binding] public class Utility_Subtests:

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

问题是,如果我运行了一个有用的步骤,那么这条线将是错误的;不起作用。我得到一个错误:

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");
    }
}
我不明白为什么这不起作用,因为它几乎与示例中显示的完全相同

更新:

我通过删除我的一个方法中的static来解决这个问题。我真傻

更新2:更多信息

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

我可以调用这些方法。。。但是我不能使用:string attribute=ScenarioContext.Current.CurrentScenarioBlock.ToString;因为它不在场景上下文中,如果这样做有意义的话,因为它在特性之前运行这个

以下是我的一个典型测试步骤:

[When@I将ICE发送到测试帐户:**] 公共静态无效子测试\u IICEToTestAccountstring ICeCount { 尝试 { OpenVMSDriver.SendShellCommandICE SET+iceAccount; } 捕获异常ex{TestDriver.CatchNTrashex;} 字符串属性=ScenarioContext.Current.CurrentScenarioBlock.ToString; 字符串attrValue=Utility.GetAttributeValueattribute; TestDriver.ResultsLog.logsubstatAttribute++attrValue.Replace.*,iceAccount; } 这样做的目的是向虚拟机发送一个命令,并给我一个发生了什么的日志。为了获得一些好的细节,我捕获了当前场景块,然后读取属性值并将其写入日志

问题是如果我只是这样调用这个方法:Subtest\u iicetotestaccount更快

我无法读取当前属性,因为它们会引发异常


所以我想用WhenI-ICE来测试账户:更快;但是我在标题中发现了错误。也许这不是最好的方法,我应该写一个方法来处理删除和恢复公司的所有步骤。

您应该将其更改为

[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步骤中运行给定步骤?即使是一行额外的代码,也要将给定的、时间和步骤完全分开:

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
如果我想使用一个有用的步骤而不使用给定的测试设置(我运行一个有用的步骤提供的测试设置),那么您想使用什么呢

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

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

有什么理由不加评论吗?给出了什么?它是一个属性还是一个方法?它是SpecFlow中的一个方法,但在我看来它是一个抽象的方法。我要离开github上的例子:嗯。为我编译,使用最新的SpecFlow包。哦,我不觉得很傻。。。我的一个方法中有一个是静态的。。。我删除了它,现在它进行编译。这将创建一个不明确的步骤定义,以具有重复的给定属性。问题是,如果我有10个场景,我不希望每个场景都运行后台。后台只需在BeforeFeature部分中运行1。我只是想利用现有的步骤来实现这一点。但是这看起来不太可能。我当然可以直接调用函数,但是我失去了被调用步骤的上下文。我确实捕获了这些步骤的内容,以便记录日志。您是否丢失了所调用步骤的上下文?您正在使用ScenarioContext.Current吗?你能发布更多的步骤定义以及你想如何使用它们吗?我想我们需要更多关于你问题的背景资料。更新更多信息