.NET Core - 在集成测试中获取父级程序集名称

8

我有一个集成测试项目,使用Microsoft.AspNetCore.TestHost包在内存中托管。然后我有一个用于这些测试的库。我想从我的库获取测试项目的程序集名称。因此结构看起来像这样。

TestHost --> TestProject --> MyLibrary

我所做的是尝试调用以下方法: Assembly.GetExecutingAssembly() 返回 MyLibrary 程序集 Assembly.GetCallingAssembly() 返回 MyLibrary 程序集 Assembly.GetEntryAssembly() 返回 TestHost 程序集。
有没有办法在不通过将程序集从 TestProject 传递到 MyLibrary 的情况下自动获取这些信息?
编辑: 正如 @svoychik 建议的那样,我也尝试了直接从 TestProject 调用 MyLibrary 中的方法时调用 Assembly.GetCallingAssembly(),但返回了以下内容:

System.Private.CoreLib, Version=4.0.0.0, Culture=neutral,


你看过这个吗?:https://www.codeproject.com/tips/791878/get-calling-assembly-from-stacktrace - Stefan
我没有一个好的答案来回答你的问题,但是我可以问一下,为什么你想要这个信息? - Lasse V. Karlsen
如果您没有动态加载MyLibrary,则可以使用GetReferencedAssemblies计算父程序集。 - Vasek
1
@Stefan 是的,这也返回了 System.Private.CoreLib, Version=4.0.0.0 - TjDillashaw
2个回答

0

在某些假设的情况下,您可以潜在地使用Stacktrace类来实现这样的功能。但这并不容易适用于所有情况。

为了使其工作,并且不使其更加复杂,我们需要假设代码不是从与运行testhost的线程不同的线程中调用的,并且使用我们的dll的命名约定。然后,在测试运行期间,我们可以检查当前堆栈跟踪,并尝试在调用层次结构中建立“我们”的dll。

您可以使用类似于以下代码:

            var method = new System.Diagnostics.StackTrace()
               .GetFrames()
               .Select(x => x.GetMethod())
               .FirstOrDefault(x => x.DeclaringType.FullName.Contains("Contoso");

Contoso是我们系统中每个dll的命名约定的一部分。或者,您还可以过滤掉不想要的任何内容:

           var method = new System.Diagnostics.StackTrace()
               .GetFrames()
               .Select(x => x.GetMethod())
               .Where(x => !x.DeclaringType.FullName.Contains("XUnit") && !x.DeclaringType.FullName.Contain("System")).ToList();

在每种情况下,您可以从方法中获取更多信息,例如模块、程序集名称、路径等。当测试引导逻辑复杂且需要进行扩展日志记录时,这非常有用。

0
根据 MSDN文档 中 GetCallingAssembly 的说明:

返回调用当前正在执行的方法的方法所在的程序集

因此,您只能在直接被 TestProject 调用的方法中检索调用程序集 TestProject。如果代码的其他部分需要调用程序集,则可以将其保存在变量中以便后续使用。

例子: 假设你有TestProject -> TestLibrary

TestProject

public class TestClass
    {
        public void TestWrite()
        {
            new ConsoleWriter().Write("hello world");
        }
    }

测试库

namespace TestLibrary
{
    public class ConsoleWriter
    {
        public void Write(string s)
        {
            Console.WriteLine(s);
            Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly().GetName());
            Test();
        }

        private void Test()
        {
            Console.WriteLine("In test method");
            Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly().GetName());
        }
    }
}

输出

hello world
TestProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
In test method
TestLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

不幸的是,我也尝试过这个,但我得到的是 System.Private.CoreLib,Version=4.0.0.0,Culture=neutral - TjDillashaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接