未能解决与来自jenkins的塞西尔的组装

wf82jlnq  于 2023-06-28  发布在  Jenkins
关注(0)|答案(1)|浏览(124)

在我的解决方案中,我用NUnit编写了一个使用Mono. Cecil的单元测试。
这个概念很简单:我有三个程序集 ASourceATestATestUtils
1.ASource:包含我要测试的类“MyClass”。(该程序集引用其他程序集。)
1.ATest:包含测试 *ASource * 中“MyClass”的单元测试。
1.ATEstUtils:References Mono.塞西尔提供了实用方法来-我简单地给予一个例子-返回输入类型的所有属性名称(我知道,我不需要Mono.Cecil来做这件事,但它只是一个例子)。
在我的 ATEstUtils 中,我像这样加载程序集 ASource

// In ATestUtils
public static IEnumerable<PropertyDefinition> GetPropertiesFromType(Type typeOfClass)
{
    var ass = AssemblyDefinition.ReadAssembly(typeOfClass.Assembly.Location);
    var refs = ass.MainModule.ImportReference(typeOfClass);
    var typeDef = refs.Resolve();
    
    return typeDef.Properties;
}

当我在本地机器上使用 ATEstUtils 中的方法运行我的单元测试“MyUnitTest”时(调试和发布),它工作得很好。当它在我的jenkins上执行时,它给出以下错误:

Error : ATest.MyUnitTestClass.MyUnitTest

Mono.Cecil.AssemblyResolutionException : Failed to resolve assembly: 'ASource, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
   bei Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name, ReaderParameters parameters) in C:\src\cecil\Mono.Cecil\BaseAssemblyResolver.cs:Zeile 122.
   bei Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name) in C:\src\cecil\Mono.Cecil\BaseAssemblyResolver.cs:Zeile 117.
   bei Mono.Cecil.DefaultAssemblyResolver.Resolve(AssemblyNameReference name) in C:\src\cecil\Mono.Cecil\DefaultAssemblyResolver.cs:Zeile 33.
   bei Mono.Cecil.MetadataResolver.Resolve(TypeReference type) in C:\src\cecil\Mono.Cecil\MetadataResolver.cs:Zeile 110.
   bei Mono.Cecil.ModuleDefinition.Resolve(TypeReference type) in C:\src\cecil\Mono.Cecil\ModuleDefinition.cs:Zeile 748.
   bei Mono.Cecil.TypeReference.Resolve() in C:\src\cecil\Mono.Cecil\TypeReference.cs:Zeile 280.
   bei ATestUtils.TestTools.GetPropertiesFromType(Type typeOfClass) in D:\Hudson\workspace\MyBranchName\MyProject\ATestUtils\TestTools.cs:Zeile 47.
   bei ATest.MyUnitTestClass.MyUnitTest()

我检查了我的jenkins上的路径“typeOfClass.Assembly.Location”,我非常确定dll是在我的jenkins的测试步骤中创建和存在的。
我有一种感觉,我还没有理解如何正确地用Mono. Cecil加载程序集。是否有可能我的项目ATest无法在jenkins上正确加载,因为它依赖于其他程序集?我也必须“以某种方式”加载它们吗?如果是这样,怎么会这样?为什么它在我的本地机器上工作?
我的环境:

  • Visual Studio 2022 v17.6.3
  • Mono.塞西尔v0.11.5
  • NUnit v3.13.3
  • NUnit3TestAdapter v4.5.0。
  • Jenkins v2.401.1,使用jenkins脚本(管道语法)bs.Windows10.amd64,测试步骤执行powershell脚本,该脚本使用NUnit.Console 3.12.0和www.example.com执行单元测试opencover.4.7.1221

我很感激任何帮助。如果需要更多的信息来回答这个问题,我很乐意提供。

yhqotfr8

yhqotfr81#

你必须更详细地描述这个例子。据我所知,您将一个类型从ASource程序集传递给GetPropertiesFromType方法。我假设类型不是NULL。在这种情况下,typeOfClass.Assembly.Location也应该给予正确的位置,并且应该加载程序集。现在我不明白你为什么再次导入传递的类型?您知道此类型包含在程序集中。因此,我写如下:

var typeDef = ass.MainModule.Types.SingleOrDefault(x => x.FullName == typeOfClass.FullName);

另外,我假设您的意思是IEnumerable<PropertyDefinition>作为GetPropertiesFromType方法的返回类型?
如果我的假设是正确的,并且程序集ASource被配置为ATest中的项目引用,那么我的单元测试将成功运行。

[Test]
public void Test1()
{
    var props = MyUtil.GetPropertiesFromType(typeof(MyClass));
    foreach (var prop to props)
    {
        Assert.That(prop, Is.Not.Null);
    }
}

单元测试程序集中是否引用了您的程序集?ASource引用的所有程序集是否也被复制,以便ATest可以找到它们?

相关问题