首页 > 解决方案 > C# - 我可以使用调用方法属性来确定是否允许调用具有属性的方法吗?

问题描述

我们正在使用 NUnit 进行自动化测试。我们目前正在使用 NUnit 类别属性来过滤我们的测试套件,以方便基于特定测试环境进行测试选择。

我们遇到的问题是测试维护。有时,一个新的或修改过的测试需要一个元素在测试环境中,但是所需的 Category 属性没有正确地添加到测试中。通常我们知道哪些具体方法直接依赖于具体的环境元素。我想将这些必需的元素“冒泡”到调用它们的测试方法中。我想标记——在构建时——测试调用依赖方法的方法,而没有适当的 Category 属性来指示元素的存在。警告或构建错误都可以。

这个用例感觉类似于 System.Obsolete 属性的用法。我正在考虑在需要环境元素的方法上使用属性,并标记调用依赖方法的方法。但是,我还需要考虑调用方法的 NUnit 类别属性,以确定条件是否应标记为不。

在下面的示例中,我的 finalFunc() 方法需要一个“事物”。SANDBOX_Test() 方法需要“事物”才能运行,因此从 SANDBOX_Test() 调用 finalFunc() 应该没有问题。但是,方法 SANDBOX_Test_Should_Fail_To_Compile() 没有指定“事物”的 NUnit 类别属性,因此对 finalFunc() 的调用应该为此方法提供编译器错误(或至少是警告)。

我展示了带有中间方法的代码,因为经常不直接从测试中调用有问题的方法。我希望我需要使用相同的 [Requirement("thing")] 属性标记intermediateFunc。在这种情况下,这个“次要”需求属性或 NUnit 类别属性将足以防止标记对 finalFunc 的调用。(如果可以不需要将属性放在中间方法上,那就太好了。)

是否可以使用属性来做到这一点?我应该考虑其他方法吗?

using NUnit.Framework;
using System;

namespace MyTests
{
    public class RequirementAttribute : Attribute
    {
        public string requiredItem { get; set; }

        public RequirementAttribute(string item)
        {
            requiredItem = item;
        }
    }


    [TestFixture]
    public class SANDBOX
    {
        [Test]
        [Category("requires_thing")]
        public void SANDBOX_Test()
        {
            Console.WriteLine(intermediateFunc().ToString());
        }

        [Test]
        public void SANDBOX_Test_Should_Fail_To_Compile()
        {
            Console.WriteLine(intermediateFunc().ToString());
        }
       
        int intermediateFunc()
        {
            return finalFunc();
        }

        [Requirement("thing")]
        int finalFunc()
        {
            return 9;
        }
    }
}

标签: c#attributes

解决方案


推荐阅读