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());
我不知道数组"值"的数量与我正在寻找的字符串对应。因此,我不认为这是一个解决方案。
这并不难做到:
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
名称空间中。
有一些东西你想检查,例如一个有效的导航目标。我不确定你的例子中的字符串做什么,但你可以在属性中添加转换函数,如果你想。