尝试以通用方式实现c#,specflow时的模糊步骤定义

时间:2016-07-26 19:30:25

标签: c# visual-studio-2015 nunit specflow

我已经按照以下方式实现了代码。

public abstract class BaseDocumentStep<T> where T : class, new()
{
    protected T _document;

    [Given(@"I Add New '(.*)'")]
    public void GivenIAddNew(string p0)
    {
        Console.WriteLine(p0);
    }

}

[Binding]
public class CustomerSteps : BaseDocumentStep<Customer> 
{

}

[Binding]
public class EmployeeSteps : BaseDocumentStep<Employee>
{

}

功能文件: - a)客户特征

Scenario: Add New Customer
Given I Add New 'Customer'

b)员工特征

 Scenario: Add New Employee
Given I Add New 'Employee'

当我运行这些场景时。我收到了以下错误:

- 的&GT;绑定错误:为步骤'给定我添加新'客户''找到不明确的步骤定义:BaseDocumentStep 1.GivenIAddNew(String), BaseDocumentStep 1.GivenIAddNew(String) 在场景之后

我无法弄清楚,为什么specflow会认为此步骤不明确?

先谢谢。 阿迪。

2 个答案:

答案 0 :(得分:0)

阿迪,

您是否有任何理由要使用抽象类进行测试?我已经使用specflow几年了,我一直试图让它们保持简单和线性。您可以尝试用以下步骤替换步骤定义文件:

[Binding]
public class EmployeeSteps
{
    [Given(@"I Add New '(.*)'")]
    public void GivenIAddNew(string p0)
    {
        Console.WriteLine(p0);
    }
}

这对我来说很好。除非你有其他理由不让你的步骤这么简单,否则这应该可以正常工作。

答案 1 :(得分:0)

这里的问题是,在Specflow中,所有步骤都是全局的,因此如果在基类中声明一个步骤,那么该步骤也会在每个派生类中声明。所以你得到一个

的实例
    var settings = {
  "async": true,
  "crossDomain": true,
  "url": "http://mycrm.com/service/v4_1/rest.php",
  "method": "POST",
  "headers": {
    "cache-control": "no-cache",
    "postman-token": "e85b8af0-3234-45c8-f5ec-abe8xx4d6efd",
    "content-type": "application/x-www-form-urlencoded"
  },
  "data": {
    "method": "get_entry",
    "input_type": "json",
    "response_type": "json",
    "rest_data": "{\"session\":\"xxyyxxsmkdemnmdm1212\",\"module_name\":\"Accounts\",\"id\":\"12345-6789-1214-1234\",\"select_fields\":{},\"link_name_to_fields_array\":{ }, \"track_view\":true}"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});
<{1}}和[Given(@"I Add New '(.*)'")] public void GivenIAddNew(string p0) { Console.WriteLine(p0); }

中的

不应在基类中声明步骤绑定方法,因为它们是全局的,所以始终可以找到这些步骤。

您想要通过通用设计实现的目标并不完全清楚,但也许如果您提供更多相关信息(可能是另一个问题更好),那么我们可以帮助您实现不需要使用绑定类继承的解决方案。