nunit - 从Test方法的自定义属性设置Order属性

时间:2018-01-08 10:44:08

标签: c# nunit

我们说我们有自定义属性:

[Precondition(1, "Some precondition")]

这将实现[Test, Order(1), Description("Some precondition")]

我可以访问和修改此方法的Order属性(或创建一个属性)吗? 我可以修改DescriptionAuthor,但订单不可能。

我试过了

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),它就不会做任何事情。

2 个答案:

答案 0 :(得分:1)

我有两个答案可供选择。一个是“不要这样做”,另一个是如何做到这一点。只是为了好玩,我将两个答案单独放在一起,这样他们就可以相互竞争。这个是为什么我认为这不是一个好主意。

  1. 编写

    很容易

    [Test, Order(1), Description("xxx")]或同等的......

    [Test(Description="xxx"), Order(1)]

  2. 建议的属性为用户提供了第二种指定顺序的方法,可以为测试分配两个不同的顺序。将赢得当天的两个属性中的哪一个取决于(1)每个属性的实现方式,(2)列出属性的顺序以及(3)您运行的平台。出于所有实际目的,它是非确定性的。

  3. 保持两个独立的东西允许开发人员独立决定他们需要哪个...这就是NUnit将它们分开的原因。

  4. 使用标准属性意味着开发人员可以依赖nunit文档来告诉他们属性的作用。如果你实现自己的属性,你应该记录它本身的作用以及它在存在标准属性时的作用......如上所述,这很难预测。

  5. 我知道这不是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)。并且只有代码中实际存在的属性才会收到此类调用。