我们说我们有自定义属性:
[Precondition(1, "Some precondition")]
这将实现[Test, Order(1), Description("Some precondition")]
我可以访问和修改此方法的Order
属性(或创建一个属性)吗?
我可以修改Description
和Author
,但订单不可能。
我试过了
1:context.Test.Properties["Order"][0] = order;
2:method.CustomAttributes.GetEnumerator()
通过
走堆栈帧 Object[] attributes = method.GetCustomAttributes(typeof(PreconditionAttribute), false);
if (attributes.Length >= 1){...}
3:
OrderAttribute orderAttribute = (OrderAttribute)Attribute.GetCustomAttribute(i, typeof(OrderAttribute));
orderAttribute.Order = _order;
这是readonly。
如果我尝试orderAttribute.Order = new OrderAttribute(myOrd)
,它就不会做任何事情。
答案 0 :(得分:1)
我有两个答案可供选择。一个是“不要这样做”,另一个是如何做到这一点。只是为了好玩,我将两个答案单独放在一起,这样他们就可以相互竞争。这个是为什么我认为这不是一个好主意。
编写
很容易 [Test, Order(1), Description("xxx")]
或同等的......
[Test(Description="xxx"), Order(1)]
建议的属性为用户提供了第二种指定顺序的方法,可以为测试分配两个不同的顺序。将赢得当天的两个属性中的哪一个取决于(1)每个属性的实现方式,(2)列出属性的顺序以及(3)您运行的平台。出于所有实际目的,它是非确定性的。
保持两个独立的东西允许开发人员独立决定他们需要哪个...这就是NUnit将它们分开的原因。
使用标准属性意味着开发人员可以依赖nunit文档来告诉他们属性的作用。如果你实现自己的属性,你应该记录它本身的作用以及它在存在标准属性时的作用......如上所述,这很难预测。
我知道这不是SO的真正答案,但它也不是纯粹的意见。提供您想要的解决方案存在真正的技术问题。我很乐意看到人们对它的看法与我将要发布的“如何”相比。
答案 1 :(得分:1)
先看看我之前的回答!如果你真的想要这样做,那么这里有操作方法......
为了组合两个现有属性的操作,您需要与这两个属性等效的代码。
在这种情况下,两者都非常简单,并且都具有大约相同数量的代码。 DescriptionAttribute
基于PropertyAttribute
,因此隐藏了部分代码。 OrderAttribute
有更多逻辑,因为它会检查以确保订单尚未设置。最终,它们都具有实现IApplyToTest
接口的代码。
因为它们都很简单,我会复制代码,以避免依赖可能改变的实现细节。从稍微更完整的OrderAttribute
开始。改名。修改ApplyToTest方法以设置描述。你完成了!
它看起来像这样,取决于您用于属性的名称......
public void ApplyToTest(Test test)
{
if (!test.Properties.ContainsKey(PropertyNames.Order))
test.Properties.Set(PropertyNames.Order, Order);
test.Properties.Set(PropertyNames.Description, Description);
}
评论你的尝试......
没有理由认为在代码中创建属性会做任何事情。 NUnit无法了解这些属性。您的属性无法修改代码,以便测试神奇地具有其他属性。 Attributes与NUnit通信的唯一方法是调用其接口(如IApplyToTest
)。并且只有代码中实际存在的属性才会收到此类调用。