如何在调用代码中找到任何属性?

时间:2016-03-31 11:02:40

标签: c# reflection attributes mstest

我有一个测试设置,我用属性装饰测试,告诉测试是否可以在某些情况下运行。在我的代码中,我想检查测试方法是否具有某个属性。这可以实现吗?

我的测试看起来像这样:

[TestClass, ParallelSeleniumTest, ExcludeFromCodeCoverage]
public class ExportIncident : ViewTest
{
    [TestMethod, TestCategory("ExcludeFromBuildServer"), SupportedBrowsers(Browser.FireFox)]
    public void Export()
    {
        ...
    }
}

在我想要断言SupportedBrowserAttribute值的地方,我的代码看起来像这样:

internal static RemoteWebDriver CreateDriver()
{
    // ReSharper disable HeuristicUnreachableCode
    switch (TestRunSettings.BrowserToUse)
    {
        case Browser.Firefox:
            return CreateFirefoxDriver();
        case Browser.Chrome:
            return CreateChromeDriver();
        default:
            throw new ArgumentOutOfRangeException();
    }
}

BrowserToUse是文件中的常量。

CreateDriver构造函数调用

ViewTest

public abstract class ViewTest : WebTest
{
    protected ViewTest()
    {
        Driver = SeleniumManager.CreateDriver();
    }

    public RemoteWebDriver Driver { get; set; }
}

2 个答案:

答案 0 :(得分:0)

您可以像这样爬行堆栈帧:

MethodBase testMethod = null;
int framesSkipped = 0;

do 
{
    testMethod = (new StackFrame(framesSkipped++)).GetMethod();
} while (!testMethod.GetCustomAttributes(typeof(TestMethodAttribute), false).Any());

SupportBrowserAttribute sba = testMethod.GetCustomAttributes(typeof(SupportBrowserAttribute)).
    FirstOrDefault() as SupportBrowserAttribute;

所以我上去了堆栈,直到找到一个具有TestMethod属性的方法。然后我尝试获取SupportBrowser属性。

如果测试方法没有这样的属性,sba将为null。否则,您可以阅读它的属性并在switch中使用它们。

答案 1 :(得分:-1)

我使用类属性解决了它(不完美):

[TestClass, ParallelSeleniumTest, ExcludeFromCodeCoverage, SupportedBrowsers(Browser.FireFox)]
public class ExportIncident : ViewTest
{
    [TestMethod, TestCategory("ExcludeFromBuildServer")]
    public void Export()
    {
        ...
    }
}

ViewTest我做:

public abstract class ViewTest : WebTest
{
    private RemoteWebDriver _driver;

    protected ViewTest()
    {
        Driver = SeleniumManager.CreateDriver();
    }

    public RemoteWebDriver Driver
    {
        get { return _driver; }
        set
        {
            var attribute = GetType().GetCustomAttribute<OnlySupportsBrowsersAttribute>();

            if (attribute != null && !attribute.Browsers.Any(x => x == TestRunSettings.BrowserToUse))
            {
                Assert.Inconclusive($"Browser {TestRunSettings.BrowserToUse} is not supported by this test");
            }

            _driver = value;
        }
    }
}