1

因此,我在无法更改的命名空间中有大量实例类。这些实际上是导出的硒测试,但该细节无关紧要。

每个类都有几个我需要调用的方法。一些方法名是基于类名的。所以方法看起来像

public void The[Class]Test{ blah blah}

我有代码来获取所有类的类型列表,如下所示

var tests = (from t in Assembly.GetExecutingAssembly().GetTypes()
    where t.IsClass && t.Namespace == "SeleniumTests"
    select t).ToList();

然后我想遍历这些类型并执行该方法。

我无法弄清楚如何使用动态创建的对象动态继承测试类,该对象具有我想要调用的覆盖或替代方法。

然后我尝试使用 expando 对象并复制类的位。这也不起作用,因为我需要的一些属性保留在类实例中并且是私有的,因此只能在我需要覆盖的方法中设置。

所以基本上我认为我需要一些方法来修改名称在运行时已知的类的行为。

编辑

我要覆盖的方法在实例上设置私有属性。基类看起来像这样。

 [TestFixture]
    public class Login
    {
        private IWebDriver driver;


        [SetUp]
        public void SetupTest()
        {
            driver = new FirefoxDriver();

        }

        [TearDown]
        public void TeardownTest()
        {

        }

        [Test]
        public void TheLoginTest()
        {

        }

        }

我想将 FirefoxDriver() 更改为 Chrome 或 IE 驱动程序。

所以我试过了

static void Main(string[] args)
{

    var tests = (from t in Assembly.GetExecutingAssembly().GetTypes()
        where t.IsClass && t.Namespace == "SeleniumTests"
        select t).ToList();


    foreach (var t in tests)
    {

        var test = (dynamic)Activator.CreateInstance(t);

        test.driver = new ChromeDriver();

        test.SetupTest();
        t.GetMethod(String.Format("The{0}Test", t.Name)).Invoke(test, null);
        test.TeardownTest();
 }


    Console.ReadLine();
}

但这不起作用,因为驱动程序属性是私有的。这意味着我认为我需要重写 SetupTest() 方法。如果我可以从 Login 继承,那会很好,但是当仅通过反射知道类型时,我不确定如何执行此操作。

4

1 回答 1

1

您已经通过反射获取并调用了一个方法,因此设置一个字段也没什么大不了的:

foreach (var t in tests)
{
    var test = (dynamic)Activator.CreateInstance(t);

    test.SetupTest();
    t.GetField("driver", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(test, new ChromeDriver());
    t.GetMethod(String.Format("The{0}Test", t.Name)).Invoke(test, null);
    test.TeardownTest();
 }
于 2013-04-10T13:24:00.233 回答