そのため、変更できない名前空間にインスタンス クラスが多数あります。これらは実際にはエクスポートされたセレン テストですが、その詳細は関係ありません。
各クラスには、呼び出す必要のあるメソッドがいくつかあります。一部のメソッド名はクラス名に基づいています。したがって、メソッドは次のようになります
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() メソッドをオーバーライドする必要があると思います。ログインから継承できれば問題ありませんが、型がリフレクションによってのみ認識される場合、これを行う方法がわかりません。