Pregunta

Tengo un proyecto de prueba de unidad en Visual Studio 2010 (.NET 4) que utiliza el marco de pruebas de XUNIT.NET, MOQ y el marco de aislamiento de moles para generar tristes de métodos estáticos. Estoy usando xunit versión 1.9 en una máquina de 64 bits.

Para ejecutar pruebas desde la línea de comandos, estoy usando el siguiente comando:

moles.runner.exe Project.tests.dll /runner :xunit.console.clr4.exe

Sin embargo, obtengo la siguiente excepción cada vez:

instrumenting ... comenzó XUNIT.NET Console Test Runner (64 bits .net 4.0.30319.1) Copyright (C) 2007-11 Microsoft Corporation.

Excepción no controlada: System.MethodAccessException: intento de seguridad Método transparente 'xunit.consoleclient.program.main (System.String [])' Para acceder al método crítico de seguridad. 'System.AppDomain.Add_unhandledException (System.unhandledexceptionEventHandler)' ha fallado. en xunit.consoleclient.program.main (cadena [] args) en Microsoft.moles.runner.molesrunner.runnerrunner.run (cuerda corredora, Cadena [] args) en Microsoft.moles.runner.molesrunner.runnerrunner.run (cuerda corredora, Cadena [] args) en Microsoft.moles.runner.molesrunner.launchrunnerentrypoint (MolesRunnerOPtions Opciones) en Microsoft.moles.Runner.MolesRunner.RunnerMain (String [] args) en Microsoft.Moles.Runner.Program.Main (String [] Args)

Parece que la excepción viene de xunit; Sin embargo, soy capaz de ejecutar las pruebas usando xunit.console.clr4.exe solo sin problemas. Solo falla cuando se usa la consola XUNIT del corredor de Moles.

Encontré esto en un post de foro:

En el marco .NET 4, las reglas de transmisión de seguridad evitan cualquier Código transparente de seguridad de llamando al código crítico de seguridad.

¿Qué puedo verificar para determinar la causa de este error? ¿Hay un ajuste de seguridad que necesito cambiar para evitar esto?

Nota: También estoy teniendo el mismo problema exacto en una estación de trabajo de 32 bits.

Actualización: Decidí descargar el código de http://xunit.codeplex.com/sourcecontrol/changeset/changes/600246119dca y depurar mi mismo. En el proyecto XUNIT.CONSOLE (la salida de la cual es la EXE que se invoca del corredor de moles), el hilo principal de ejecución se ve así:

[STAThread]
public static int Main(string[] args)
{
    Console.WriteLine("xUnit.net console test runner ({0}-bit .NET {1})", 
        IntPtr.Size * 8, Environment.Version);
    Console.WriteLine("Copyright (C) 2007-11 Microsoft Corporation.");

    if (args.Length == 0 || args[0] == "/?")
    {
        PrintUsage();
        return -1;
    }

    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

    try
    {
        CommandLine commandLine = CommandLine.Parse(args);

        int failCount = RunProject(commandLine.Project, 
            commandLine.TeamCity, commandLine.Silent);

        if (commandLine.Wait)
        {
            Console.WriteLine();
            Console.Write("Press any key to continue...");
            Console.ReadKey();
            Console.WriteLine();
        }

        return failCount;
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine();
        Console.WriteLine("error: {0}", ex.Message);
        return -1;
    }
    catch (BadImageFormatException ex)
    {
        Console.WriteLine();
        Console.WriteLine("{0}", ex.Message);
        return -1;
    }
}

Cuando ejecuto mis pruebas mientras ejecuto el código, todo funciona bien, como se esperaba (ya que nunca tuve problemas en ejecución de pruebas de Xunit solamente). Noté la siguiente línea, que parece estar donde se tira la excepción según el mensaje de error y la traza de la pila de mi publicación original:

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

Comenté esta línea, construí xunit.console.exe , e intenté usarlo como el argumento / corredor al ejecutar el corredor de moles nuevamente. Esta vez, no se lanzó ninguna excepción.

Todavía estoy en una pérdida de por qué se está lanzando una excepción de seguridad en esta línea cuando se invoca de Moles.Runner.exe, pero no cuando ejecuto la consola Xunit por sí misma.

¿Fue útil?

Solución

Compilación del último código fuente de CodePlex se ejecuta sin la MethodAccessException.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top