2010-12-02 8 views
22

Cuando la clase utilizada Assembly.GetEntryAssembly run() en la prueba de unidad, el Assembly.GetEntryAssembly() es nulo. ¿Hay alguna opción para definir Assembly.GetEntryAssembly() durante la prueba unitaria?.NET NUnit prueba - Assembly.GetEntryAssembly() es nulo

+0

Puede crear una instancia de ensamblaje simulada y usarla para las pruebas de su unidad. – Bernard

+0

@Bernard: ¿Cómo puedo hacerlo? – Simon

+0

Utilice uno de los métodos estáticos de la clase de montaje, tales como GetAssembly() o GetCallingAssembly(). – Bernard

Respuesta

8

Puede hacer algo como esto con Rhino Mocks: Encapsule la llamada Assembly.GetEntryAssembly() en una clase con la interfaz IAssemblyLoader e inyéctela en la clase que está probando. Esto no se ha probado, pero algo en la línea de lo siguiente:

[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(); 
    } 
} 
37

poner en práctica el método de SetEntryAssembly (montaje Asamblea) da en

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

a su proyecto de prueba unitaria.

  /// <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); 
     } 
+3

El enlace está roto. – Spivonious

+0

No estoy seguro si esto ayuda: https://github.com/lyphtec/LyphTEC.Repository.Dapper/blob/master/src/LyphTEC.Repository.Dapper.Tests/AssemblyUtils.cs – JohnZaj