2011-09-10 12 views
6

Ho una serie di test NUnit e alcuni falliscono, tuttavia non riesco a trovare una ragione, e l'eccezione non mi dice nulla. Questo è il mio caso:Il test NUnit fallisce a causa di 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); 
    }  

Unit Test Eccezione:

System.AccessViolationException: Tentativo di lettura o scrittura della memoria protetta. Questo è spesso un'indicazione che un'altra memoria è corrotta.

Se nella mia azione passo un valore nullo alla vista parziale, così: return PartialView(@"MyPartialView", null); Poi passa il test.

Anche altri casi simili falliscono, altri ancora passano. Non sono stato in grado di identificare una ragione per ciascuno.

Qualcuno può aiutarmi a identificare cosa c'è che non va?

Grazie,

EDIT: Ok, ho fissato tutti gli altri test in fallimento e ora ho solo quelli con il System.AccessViolationException sinistra.

AGGIUNTO procedura Imposta la mia forma di test:

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

     repository = MockRepository.GenerateStub<ISomeRepository>(); 

     someController = new SomeController 
      (repository); 

     controllerBuilder.InitializeController(someController); 
    } 
+0

Questo test passa se rimuovi l'attributo outputchache? – David

+0

@Dvd - Altre azioni con lo stesso attributo passano senza problemi ... Ma ci proverò ... In questo momento sto solo girando al buio, vedo cosa colpisce. EDIT: Nop ... stesso risultato. – AJC

+0

Solo per essere certi, questo test ha esito negativo quando viene eseguito in isolamento o solo quando viene eseguita l'intera suite? –

risposta

3

Trovato una risposta ... problema veramente stupido, come la maggior parte dei problemi di programmazione. Come dico sempre, se non riesci a risolverlo nel primo paio d'ore, allora sai che è davvero qualcosa di veramente stupido.

Qui è dove ho trovato la risposta, mi ha portato un po ', ma il nome della questione non ha aiutato le cose sia:

Attempted to read or write protected memory

In breve, ho dovuto sostituire il MvcContrib DLL.

Grazie a tutti per l'aiuto ...

+0

Sono contento che tu abbia risolto il problema. Puoi contrassegnare la tua risposta come risposta per aiutare a chiudere la domanda –

+0

@Richard -Sì, ma devo aspettare 2 giorni per farlo. Il sistema non mi permette di chiuderlo prima – AJC

0

System.AccessViolationException: Tentativo di lettura o scrittura della memoria protetta. Questo è spesso un'indicazione che un'altra memoria è corrotta.

Questo errore si verifica in un campo quando si gioca con codice gestito/non gestito, in particolare allocando risorse non gestite nel codice gestito e liberate troppo presto, quando il codice gestito esiste ancora per accedere alle risorse rilasciate dal sistema operativo.

Si sta utilizzando IntPtr in modo inproprio, o si è verificata una perdita di memoria oppure la dichiarazione di una funzione COM esterna/Win32 non è corretta, f/e negli attributi [DllImport (...)].

sguardo al codice più criticall & presizely

exceptionManager.HandleException(ex, FT_EXCEPTION_POLICY); 
+0

Grazie per la tua risposta ... Il gestore delle eccezioni viene utilizzato nella maggior parte delle mie azioni e molte di esse passano. Inoltre, ho un caso di test unitario per quando l'eccezione viene lanciata e passa correttamente. – AJC

+0

Commentato il try catch, lo stesso risultato ... Quello che mi viene fuori è che è un codice molto semplice ... – AJC

0

Potrebbe essere un problema condizione di threading/gara.

Non si sta creando il controller, il controllo parziale nel test. Pertanto, molti test utilizzano la stessa istanza del controller, questo può portare a errori di corruzione della memoria.

Provare a creare e smaltire il controller all'interno di ciascun test.

+0

L'errore si verifica anche se eseguo i test uno per uno ... – AJC

+0

È sempre lo stesso test che falliscono e lo stesso che passa? –

+0

Sì, sempre lo stesso ... Ho passato le ultime ore a cercare uno schema tra di loro ma non riesco a trovarne uno ... – AJC

Problemi correlati