我目前正在编写一个单元测试框架,最终将运行用Visual Studio编写的标准单元测试。框架目前无法正常使用访问者。请考虑以下测试方法:
[TestMethod()]
public void TestMethod()
{
ExampleMethods_Accessor target = null;
target = new ExampleMethods_Accessor();
target.SomeMethod();
}
在此示例中,访问者已由Visual Studio生成。使用Visual Studio的单元测试环境运行时,单元测试工作正常。但是,我想从我的框架内调用TestMethod()。在“target = new ExampleMethods_Accessor()”行中,抛出以下异常:
“Proband.ExampleMethods_Accessor”的类型初始化程序引发了一个例外。
内部异常:
无法加载文件或程序集:Proband,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null ...
有谁知道Microsoft Unit Testing Framework如何调用单元测试?我在想它可能是由于缺少TestContext对象。在我的情况下,这是“空”。在Visual Studio中启动单元测试时,TestContext对象包含大量信息。可能是,我需要正确地初始化它吗?怎么需要初始化?
感谢您的帮助, 基督教
修改
我一直在试验访问者的工作方式。我使用ILSpy来查看Proband_Accessor.dll中生成了什么代码。事实证明导致异常的指令是:
SomeClass_Accessor.m_privateType = new PrivateType("Probant, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Probant.SomeClass");
我修改了我的单元测试代码(仅用于测试):
[TestMethod()]
[DeploymentItem("Proband.dll")]
public void SomeMethodTest()
{
ExampleMethods_Accessor target = null;
ExampleMethods c = null;
try
{
Assembly.Load("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); // this works fine
PrivateType tx = new PrivateType(typeof(ExampleMethods)); // this works fine as well (also without loading the assembly)
PrivateType t = new PrivateType("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Proband.ExampleMethods"); // this causes the exception
c = new ExampleMethods(); // this works fine
target = new ExampleMethods_Accessor(); // this causes the exception as well
}
catch (Exception ex)
{
Console.WriteLine();
}
int actual;
actual = target.SomeMethod();
}
我完全不理解,为什么“新的PrivateType(”Proband,Version ....“不起作用。有人有想法吗?
答案 0 :(得分:1)
我已设法为此问题创建解决方法。
到我的AppDomain,我正在添加一个AssemblyResolveEventHandler:
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
此事件处理程序包含以下代码:
private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
if(args.Name == "Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
{
// resolving correct assembly of type under test
return typeof(ExampleMethods).Assembly;
}
else
{
return null;
}
}
现在代码行“target = new ExampleMethods_Accessor();”工作正常并返回正确的访问者对象。
我仍然不明白,为什么大会无法自动解决。
即使任何人都不太可能遇到同样的问题:我希望这个答案有助于某人:)
答案 1 :(得分:0)
我没有做任何复杂的事情,但我有:
尝试使用访问器运行单元测试时,我得到了相同的BadImageFormat异常。
我找到了以下链接:
第二次解决方案解决了我的问题。我将测试项目更改为目标.NET 4.0,但它确实有效。
答案 2 :(得分:0)
我遇到了这个问题,这是因为我从测试方法中删除了DeploymentItem
属性。一旦我再次添加它,我就不再在构建机器上出现错误。
[TestMethod]
[DeploymentItem("FedImportServer.dll")] // ** This is necessary for the build machine. **
public void SourceFileStillExistsAfterProcessingFails()
注意:我在本地运行它时从未遇到过错误。
这是错误:
Test method FedImportTests.FedImportServiceHostTest.FileNoLongerExistsAfterSucessfulProcessing threw exception:
System.TypeInitializationException: The type initializer for 'FedImportServer.Processing.FileProcessor_Accessor' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'FedImportServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.