如何创建一个在c#中转发方法调用的代理对象?
我尝试使用selenium来运行测试;似乎没有一种好方法可以在多个浏览器上运行同一组单元测试 我读了这篇关于并行运行测试的帖子: 但是,我使用的是VisualStudio单元测试框架 我可以创建如下代理类:如何创建一个在c#中转发方法调用的代理对象?,c#,unit-testing,selenium,C#,Unit Testing,Selenium,我尝试使用selenium来运行测试;似乎没有一种好方法可以在多个浏览器上运行同一组单元测试 我读了这篇关于并行运行测试的帖子: 但是,我使用的是VisualStudio单元测试框架 我可以创建如下代理类: public class SeleniumProxy { private List<DefaultSelenium> targets; public SeleniumProxy() { targets = new List<DefaultS
public class SeleniumProxy {
private List<DefaultSelenium> targets;
public SeleniumProxy() {
targets = new List<DefaultSelenium>();
targets.Add(new DefaultSelenium(... "firefox"...));
targets.Add(new DefaultSelenium(... "iexplore"...));
}
public void Open(String url) {
foreach (var i in targets) {
i.Open(url);
}
}
...
}
然后像这样调用:
var selenium = getProxy();
selenium.proxy.Open("...");
c#允许动态对象使用这种语法吗
或者是类的某种元处理程序,让它们不捕获此类方法异常并手动处理它们
基本上:
如何创建一个代理对象来动态调用类的内部成员上的方法
(编辑:可能…使用DefaultSelenium对象上的反射并为每个条目在动态代理对象上创建函数存根…)如果我理解您的尝试,我认为您可以扩展以实现这一点
class Proxy : System.Dynamic.DynamicObject
{
public Proxy(object someWrappedObject) { ... }
public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)
{
// Do whatever, binder.Name will be the called method name
}
}
//做任何事……
将成为某些代码,它使用binder.Name
作为查找过程的一部分,戳戳其他对象的内部成员(大概是通过反射)
如果您需要总结简单方法调用的任何更高级的方法,则可以覆盖TryGetMember
和trygetdex
方法
在构造之后,您必须将
代理的实例强制转换为动态
,以进行任意调用,就像处理时一样。您可以利用继承,并使用工厂方法在抽象基类中定义测试,以创建selenium实例,然后为要建模的每种类型的浏览器继承此属性。然后,将使用适当的浏览器为每个继承的类运行测试。以NUnit为例:
public abstract class AbstractTests
{
protected abstract DefaultSelenium CreateSelenium();
[Test]
public void TestSomethingA()
{
DefaulSelenium selenium = CreateSelenium();
//Do some testing with selenium.
}
}
[TestFixture]
public class IETests : AbstractTests
{
protected override DefaultSelenium CreateSelenium()
{
return new DefaultSelenium("iexplore");
}
}
[TestFixture]
public class FirefoxTests : AbstractTests
{
protected override DefaultSelenium CreateSelenium()
{
return new DefaultSelenium("firefox");
}
}
如果我是你,我会再次查看Selenium Grid,它非常先进。根据我的经验,IE Selenium测试所需时间是FF的5-10倍,因此如果您尝试以自己的方式并行运行测试,您的FF测试也将花费永远的时间;反正你得等我。
public abstract class AbstractTests
{
protected abstract DefaultSelenium CreateSelenium();
[Test]
public void TestSomethingA()
{
DefaulSelenium selenium = CreateSelenium();
//Do some testing with selenium.
}
}
[TestFixture]
public class IETests : AbstractTests
{
protected override DefaultSelenium CreateSelenium()
{
return new DefaultSelenium("iexplore");
}
}
[TestFixture]
public class FirefoxTests : AbstractTests
{
protected override DefaultSelenium CreateSelenium()
{
return new DefaultSelenium("firefox");
}
}