2011-09-10 14 views
6

Tengo una serie de pruebas NUnit y algunas fallan, pero parece que no puedo encontrar un motivo, y la excepción no me dice nada. Este es mi caso:La prueba NUnit falla debido a System.AccessViolationException

//Controller Action 
    [HttpPost] 
    [AjaxExceptionHandler] 
    [OutputCache(Duration = 0)] 
    public PartialViewResult SomeAction(long id) 
    { 
     try 
     { 
      var model = _repository.GetModel(id); 
      return PartialView(@"MyPartialView", model); 
     } 
     catch (Exception ex) 
     { 
      exceptionManager.HandleException(ex, FT_EXCEPTION_POLICY); 
      throw; 
     } 
    } 

    //Action Unit Test 
    [Test] 
    [Category(TestConstants.UnitTest)] 
    public void SomeAction_Returns_Expected_View() 
    { 
     var model = Builder<ViewModel>.CreateNew().Build(); 

     repository.Stub(it => it.GetModel(Arg<long>.Is.Anything)).Return(model); 

     var viewResult = (PartialViewResult)someController.SomeAction(1); 
     Assert.AreEqual(@"MyPartialView", viewResult.ViewName); 
    }  

Test Unit Excepción:

System.AccessViolationException: Intento de leer o escribir en la memoria protegida. Esto a menudo es una indicación de que otra memoria está corrupta.

Si en mi acción paso un valor nulo a la vista parcial, así: return PartialView(@"MyPartialView", null); Luego pasa la prueba.

Otros casos similares fallan también, pero otros pasan. No he podido identificar una razón para cada uno.

¿Alguien me puede ayudar a identificar lo que está mal?

Gracias,

EDIT: Ok, me fijo Todas las otras pruebas que fallan y ahora tengo sólo los que tienen la System.AccessViolationException izquierda.

AÑADIDO procedimiento de configuración formar mis pruebas:

[SetUp] 
    public void SetUp() 
    { 
     controllerBuilder = new TestControllerBuilder(); 

     repository = MockRepository.GenerateStub<ISomeRepository>(); 

     someController = new SomeController 
      (repository); 

     controllerBuilder.InitializeController(someController); 
    } 
+0

¿Se pasa esta prueba si se quita outputchache atributo? – David

+0

@Dvd - Otras acciones con el mismo atributo pasan sin problemas ... Pero lo intentaré ... Ahora mismo estoy disparando en la oscuridad, mira lo que sucede. EDITAR: Nop ... el mismo resultado. – AJC

+0

Solo para estar seguro, ¿falla esta prueba cuando se ejecuta de forma aislada o solo cuando se ejecuta todo el paquete? –

Respuesta

3

Encontré una respuesta ... problema realmente estúpido, como la mayoría de los problemas en la programación. Como siempre digo, si no puedes resolverlo las primeras dos horas, entonces sabes que es algo realmente estúpido.

Aquí es donde he encontrado la respuesta, me llevó un tiempo, pero el nombre de la pregunta no ayudó cosas bien:

Attempted to read or write protected memory

En resumen, he tenido que reemplazar el MVCContrib Dlls.

Gracias a todos por la ayuda ...

+0

Me alegro de que haya resuelto el problema. Puede marcar su respuesta como la respuesta para ayudar a cerrar la pregunta –

+0

@Richard -Sí, pero tengo que esperar 2 días para hacerlo. El sistema no me deja cerrarlo antes – AJC

0

System.AccessViolationException: Intento de leer o escribir en la memoria protegida. Esto a menudo es una indicación de que otra memoria está corrupta.

Este error aparece en un campo cuando se juega con código administrado/no administrado, especialmente asignando recursos no administrados en código administrado y liberándolos demasiado pronto, cuando todavía existe código administrado para acceder a los recursos liberados por el sistema operativo.

Está utilizando IntPtr inpropertly, o tiene una pérdida de memoria, o la declaración de una función COM/Win32 externa no es correcta, f/e en los atributos [DllImport (...)].

Mira en el código más criticall & presizely

exceptionManager.HandleException(ex, FT_EXCEPTION_POLICY); 
+0

Gracias por su respuesta ... El controlador de excepciones se usa en la mayoría de mis acciones y muchas de ellas pasan. Además, tengo un caso de prueba de unidad para cuando se lanza la excepción y se transmite correctamente. – AJC

+0

Comentó la captura de prueba, el mismo resultado ... Lo que me llega es que es un código muy simple ... – AJC

0

Podría ser un problema condición de roscado/carrera.

No está creando el controlador, algún controlador en la prueba. Por lo tanto, muchas pruebas usan la misma instancia del controlador, esto puede provocar errores de corrupción de memoria.

Intente crear y eliminar el controlador dentro de cada prueba.

+0

El error ocurre incluso si ejecuto las pruebas una por una ... – AJC

+0

¿Son siempre las mismas pruebas? que fallan y lo mismo que pasan? –

+0

Sí, siempre lo mismo ... He pasado las últimas horas buscando un patrón entre ellos, pero no puedo encontrar uno ... – AJC

Cuestiones relacionadas