Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个在c#中转发方法调用的代理对象?_C#_Unit Testing_Selenium - Fatal编程技术网

如何创建一个在c#中转发方法调用的代理对象?

如何创建一个在c#中转发方法调用的代理对象?,c#,unit-testing,selenium,C#,Unit Testing,Selenium,我尝试使用selenium来运行测试;似乎没有一种好方法可以在多个浏览器上运行同一组单元测试 我读了这篇关于并行运行测试的帖子: 但是,我使用的是VisualStudio单元测试框架 我可以创建如下代理类: public class SeleniumProxy { private List<DefaultSelenium> targets; public SeleniumProxy() { targets = new List<DefaultS

我尝试使用selenium来运行测试;似乎没有一种好方法可以在多个浏览器上运行同一组单元测试

我读了这篇关于并行运行测试的帖子:

但是,我使用的是VisualStudio单元测试框架

我可以创建如下代理类:

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");
    }
}