在不提供 class 名称 and/or 方法名称的情况下获取自定义属性的值
Get value of custom attribute without providing class name and/or method name
我知道我在重复这个问题,我已经完成了一些类似的解决方案,但我正在寻找不同的解决方案。
我想读取自定义属性的值。我有下面的一段代码可以为我做这件事,但我不想硬编码 class 名称 and/or 方法名称,因为那样它对我没有用。我想让这个方法可重用,以便它可以用来从所有可用的测试方法中读取值。
属性定义:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class TestDataFile : Attribute
{
public string Path { get; set; }
public string Name { get; set; }
}
访问属性:
var attribute = (TestDataFile)typeof(DummyTest).GetMethod("Name").GetCustomAttributes(typeof(TestDataFile), false).First();
用法:
[TestFixture]
public class DummyTest
{
[Test]
[TestDataFile(Name="filename.json")]
[TestCaseSource("LoadTestData")]
public void AlwaysTrue(Dictionary<string, string> testCaseData)
{
// use test data here
}
}
我们可以在 c-sharp 中实现吗?如果是,请帮我解决。
您可以使用 StackFrame 获取对调用方法的 MethodBase 引用。考虑以下示例:
class Foo
{
[TestDataFile(Name = "lol")]
public void SomeMethod()
{
var attribute = Helper.GetAttribute();
Console.WriteLine(attribute.Name);
}
[TestDataFile(Name = "XD")]
public void SomeOtherMethod()
{
var attribute = Helper.GetAttribute();
Console.WriteLine(attribute.Name);
}
}
我们的帮助方法真正发生了魔法:
public static TestDataFile GetAttribute()
{
var callingMethod = new StackFrame(1).GetMethod();
var attribute = (TestDataFile)callingMethod.GetCustomAttributes(typeof(TestDataFile), false).FirstOrDefault();
return attribute;
}
测试:
private static void Main()
{
var foo = new Foo();
foo.SomeMethod();
foo.SomeOtherMethod();
Console.ReadLine();
}
您可以在 documentation
中获得有关 StackFrame 的更多信息
您可以使用 TestCaseSource 而不是创建新的自定义属性并从中检索值。请找到示例代码片段以使用带参数的 TestCaseSource
[TestCaseSource("PrepareTestCases", new object[] { "filename.json" })]
请添加带有源名称的静态方法
protected static object[] PrepareTestCases(string param)
{
Console.WriteLine(param);
return new object[] { }; // do return the object you need
}
这将获取参数的值..
我知道我在重复这个问题,我已经完成了一些类似的解决方案,但我正在寻找不同的解决方案。
我想读取自定义属性的值。我有下面的一段代码可以为我做这件事,但我不想硬编码 class 名称 and/or 方法名称,因为那样它对我没有用。我想让这个方法可重用,以便它可以用来从所有可用的测试方法中读取值。
属性定义:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class TestDataFile : Attribute
{
public string Path { get; set; }
public string Name { get; set; }
}
访问属性:
var attribute = (TestDataFile)typeof(DummyTest).GetMethod("Name").GetCustomAttributes(typeof(TestDataFile), false).First();
用法:
[TestFixture]
public class DummyTest
{
[Test]
[TestDataFile(Name="filename.json")]
[TestCaseSource("LoadTestData")]
public void AlwaysTrue(Dictionary<string, string> testCaseData)
{
// use test data here
}
}
我们可以在 c-sharp 中实现吗?如果是,请帮我解决。
您可以使用 StackFrame 获取对调用方法的 MethodBase 引用。考虑以下示例:
class Foo
{
[TestDataFile(Name = "lol")]
public void SomeMethod()
{
var attribute = Helper.GetAttribute();
Console.WriteLine(attribute.Name);
}
[TestDataFile(Name = "XD")]
public void SomeOtherMethod()
{
var attribute = Helper.GetAttribute();
Console.WriteLine(attribute.Name);
}
}
我们的帮助方法真正发生了魔法:
public static TestDataFile GetAttribute()
{
var callingMethod = new StackFrame(1).GetMethod();
var attribute = (TestDataFile)callingMethod.GetCustomAttributes(typeof(TestDataFile), false).FirstOrDefault();
return attribute;
}
测试:
private static void Main()
{
var foo = new Foo();
foo.SomeMethod();
foo.SomeOtherMethod();
Console.ReadLine();
}
您可以在 documentation
中获得有关 StackFrame 的更多信息您可以使用 TestCaseSource 而不是创建新的自定义属性并从中检索值。请找到示例代码片段以使用带参数的 TestCaseSource
[TestCaseSource("PrepareTestCases", new object[] { "filename.json" })]
请添加带有源名称的静态方法
protected static object[] PrepareTestCases(string param)
{
Console.WriteLine(param);
return new object[] { }; // do return the object you need
}
这将获取参数的值..