Specflow:调用类中的变量,使用字符串,不带开关

本文关键字:字符串 开关 变量 调用 Specflow | 更新日期: 2023-09-27 17:49:25

这是一个使用c#和Specflow(黄瓜为c#)的自动化测试

我有一个类的url像这样:

class Paths  
{
  public static string google_home   = "www.google.com";
  public static string another_url   = "www.something.com";
  public static string facebook_home = "www.facebook.com";
}

我有一个这样的步骤定义:

[Then(@"I navigate to ""(.*)""")]  
public void INavigateTo (string url)
    {   
        Configuration.driver.Navigate().GoToUrl(Paths.url);
    }

当然这个脚本不工作,但我只是想解释这个想法。通过使用这样的步骤定义:

I navigate to "google_home"

我获得了字符串"google_home",我想用这个字符串直接选择选项Paths.google_home。我不想使用一个开关来做分配,因为有数百个url。

编辑:

链接的解决方案是这样的:

var values = typeof(Paths).GetFields();
Configuration.driver.Navigate().GoToUrl(values[0].GetValue(null).ToString());

我不知道数组"值"的数量与我正在寻找的字符串对应。因此,我不认为这是一个解决方案。

Specflow:调用类中的变量,使用字符串,不带开关

这并不难做到:

public static class Paths
{
    public static string Path1 = "";
    public static string Path2 = "";
}
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class NavigationTargetAttribute : Attribute
{
    public string Target { get; set; }
    public NavigationTargetAttribute(string target)
    {
        Target = target;
    }
}
public class MyNavigationClass
{
    [NavigationTarget(Paths.Path1)]
    public void MyNavigateMethod()
    {
        string target = GetNavigationTarget();
    }
    private string GetNavigationTarget([CallerMemberName]string caller = null)
    {
        object[] attribs = this.GetType()
                               .GetMethod(caller)
                               .GetCustomAttributes(
                               typeof(NavigationTargetAttribute), false);
        if (attribs == null)
            return "some default target";
        return ((NavigationTargetAttribute)attrib[0]).Target;
    }
}

我不会把它命名为Then,但这是我要做的。自定义属性被设置为修饰方法,并且不允许同一属性的多个副本。

GetNavigationTarget使用了c# 4中称为CallerMemberName的特性,该特性返回调用该函数的方法的名称,该名称位于System.Runtime.CompilerServices名称空间中。

有一些东西你想检查,例如一个有效的导航目标。我不确定你的例子中的字符串做什么,但你可以在属性中添加转换函数,如果你想。