单元测试——c#反射:替换一个引用的程序集



我目前正在为MutationTesting编写一个框架。代码几乎完成了,但有一小部分(花了半天时间)我不能弄清楚:

通过反射,我想执行一个方法"TestMethod",这是类"TestClass"内部。"TestClass"所在的项目引用了一个程序集,我们称它为"Proband.dll"。

"TestMethod"在Proband.dll中创建一个某种类型的对象,并在该对象上执行一个方法。

为了澄清一点:TestClass——包含单元测试的类。TestMethod——是一个单元测试。dll -包含要测试的方法/类。

在执行TestMethod之前,我已经成功地反汇编、变异和重新组装了Proband.dll。所以现在我有了一个新的"Proband.dll",它将由TestClass代替!

问题是TestClass已经在执行的中间了。我在想是否有可能创建一个AppDomain,其中新的Proband.dll将被加载,并且在新的AppDomain中,TestMethod将被执行。

我已经创建了这个AppDomain并成功地将新的Proband.dll加载到其中,但是,我不知道如何在这个新的AppDomain中执行TestMethod。我也不知道这是否会"取代"旧的Proband.dll的测试方法。

下面是我的TestClass:
[TestClass()]
public class TestClass
{
    [TestInitialize()]
    public void MyTestInitialize()
    {
        // code to perform the mutation.
        // From here, the "TestMethod" should be called with 
        // the new "Proband.dll".
    }
    [TestMethod()]
    public void TestMethod()
    {
        // test code calling into Proband.dll
    }
}

有谁知道这是如何实现的吗?或者任何线索或关键词?

谢谢,基督教

这可能有点矫枉过正了,但是看看我的答案:

AppDomain静态字段

你会想要在AppDomain中创建TestClass,你已经加载了Proband.dll,并使用MarshalByRef来保持类在AppDomain中(所以你可以稍后卸载它)。

这里是更多关于我所做的(不确切,因为我正在改变它以匹配更多你需要的)。

// Create Domain
_RemoteDomain = AppDomain.CreateDomain(_RemoteDomainName,
   AppDomain.CurrentDomain.Evidence, 
   AppDomain.CurrentDomain.BaseDirectory, 
   AppDomain.CurrentDomain.BaseDirectory, 
   true);
// Load an Assembly Loader in the domain (mine was Builder)
// This loads the Builder which is in the current domain into the remote domain
_Builder = (Builder)_RemoteDomain.CreateInstanceAndUnwrap(
    Assembly.GetExecutingAssembly().FullName, "<namespace>.Builder");
_Builder.Execute(pathToTestDll)

public class Builder : MarshalByRefObject 
{ 
    public void Execute(string pathToTestDll)
    {
        // I used this so the DLL could be deleted while
        // the domain was still using the version that
        // exists at this moment.
        Assembly newAssembly = Assembly.Load(
           System.IO.File.ReadAllBytes(pathToTestDll));
        Type testClass = newAssembly.GetType("<namespace>.TestClass", 
           false, true);
        if (testClass != null)
        {
           // Here is where you use reflection and/or an interface
           // to execute your method(s).
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新