.NET NUnit测试 - Assembly.GetEntryAssembly()为null

Sim*_*mon 35 .net nunit unit-testing

当类使用Assembly.GetEntryAssembly()在单元测试中运行时,Assembly.GetEntryAssembly()为null.是否有一些选项如何在单元测试期间定义Assembly.GetEntryAssembly()?

Man*_*BAG 50

实现中给出的SetEntryAssembly(Assembly assembly)方法

http://frostwave.googlecode.com/svn-history/r75/trunk/F2DUnitTests/Code/AssemblyUtilities.cs

到您的单元测试项目.

         /// <summary>
        /// Use as first line in ad hoc tests (needed by XNA specifically)
        /// </summary>
        public static void SetEntryAssembly()
        {
            SetEntryAssembly(Assembly.GetCallingAssembly());
        }

        /// <summary>
        /// Allows setting the Entry Assembly when needed. 
        /// Use AssemblyUtilities.SetEntryAssembly() as first line in XNA ad hoc tests
        /// </summary>
        /// <param name="assembly">Assembly to set as entry assembly</param>
        public static void SetEntryAssembly(Assembly assembly)
        {
            AppDomainManager manager = new AppDomainManager();
            FieldInfo entryAssemblyfield = manager.GetType().GetField("m_entryAssembly", BindingFlags.Instance | BindingFlags.NonPublic);
            entryAssemblyfield.SetValue(manager, assembly);

            AppDomain domain = AppDomain.CurrentDomain;
            FieldInfo domainManagerField = domain.GetType().GetField("_domainManager", BindingFlags.Instance | BindingFlags.NonPublic);
            domainManagerField.SetValue(domain, manager);
        }
Run Code Online (Sandbox Code Playgroud)

  • 链接坏了. (4认同)
  • AppDomainManager 在 .netcoreapp1.x/netcoreapp2.x /netstandard2.0 https://apisof.net/catalog/System.AppDomainManager 中不可用 (2认同)

Luk*_*ton 10

您可以使用Rhino Mocks执行类似的操作:将Assembly.GetEntryAssembly()封装到具有接口IAssemblyLoader的类中,并将其注入您正在测试的类中.这没有经过测试,但有些内容如下:

[Test] public void TestSomething() {
  // arrange
  var stubbedAssemblyLoader = MockRepository.GenerateStub<IAssemblyLoader>();
  stubbedAssemblyLoader.Stub(x => x.GetEntryAssembly()).Return(Assembly.LoadFrom("assemblyFile"));

  // act      
  var myClassUnderTest = new MyClassUnderTest(stubbedAssemblyLoader);
  var result = myClassUnderTest.MethodToTest();

  // assert
  Assert.AreEqual("expected result", result);
}

public interface IAssemblyLoader {
  Assembly GetEntryAssembly();
}
public class AssemblyLoader : IAssemblyLoader {
  public Assembly GetEntryAssembly() {
    return Assembly.GetEntryAssembly();
  }
}
Run Code Online (Sandbox Code Playgroud)