动态更改类属性参数

时间:2016-07-04 08:24:48

标签: c# nunit

如何在以下代码中动态更改属性参数(在运行时)(对于TestFixture和TestConfiguration):

[
    TestFixture("Setup 1"),
    TestConfiguration("http://spiratest", "rin", "rin", 30, 924, 2577, 
    TestConfigurationAttribute.RunnerName.NUnit)
]
    public  class SampleTestFixture
    {
        protected static int testFixtureState = 1;

        [TestFixtureSetUp]
        public void FixureInit()
        {
            //Set the state to 2
            testFixtureState = 2;
        }

        [SetUp]
        public void Init()
        {
            //Do Nothing
        }

        /// <summary>
        /// Sample test that asserts a failure
        /// </summary>
        [
        Test,
        TestCase(41681)
        ]
        public void _01_SampleFailure()
        {
            //Verify the state
            Assert.AreEqual (2, testFixtureState, "*Real Error*: State not persisted");

            //Failure Assertion
            Assert.AreEqual (1, 1, "Failed as Expected");
        }   
}

我需要在RunTime上更改TestFixture和TestConfiguration的属性参数。(不使用const参数)

如何通过反射或注释来改变它?

1 个答案:

答案 0 :(得分:1)

我怀疑你想要什么是可能的。只要您在类,方法或任何成员上拥有属性,就可以使用GetCustomAttributes随时使用反射处理这些属性。

// find the fixtures
// ...
// provide the attributes and create the fixture
var newTestInstance = Activator.CreateInstance(typeof(SampleTestFixture), theParams)

当您使用这些属性调用成员时,您将属性中的信息提供给该成员或构造函数,但是成员(或构造函数)已使用这些属性提供的值调用。你想要的是这样的:

class MyClass {
    int MyInt;
    MyClass(int param)
    {
        MyInt = param;
    }
} 

因此,当向构造函数提供参数时,其值将绑定到MyInt。当您以任何方式更改属性值NUnit 未通知时,它将不会重新创建您的测试,甚至不会修改现有测试。两者都是有害的。首先,您将创建一个全新的测试。在第二种情况下,您必须确定已运行的测试,并重新运行具有修改值的测试。

那么在运行时更改TestFixture的值时会发生什么?使用新值重新运行Shell所有测试?或者只是那些到目前为止还未运行过的人?