2011-09-10 111 views
6

我有一系列的NUnit测试,有些失败,但我似乎无法找到一个理由,而例外是什么都没有告诉我。这是我的情况:由于System.AccessViolationException NUnit测试失败

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

单元测试例外:

System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

如果在我的操作中,我将零值传递给部分视图,如下所示:return PartialView(@"MyPartialView", null);然后测试通过。

其他类似的情况也失败了,但其他人也通过了。我一直无法找出每个人的理由。

任何人都可以帮助我识别出什么问题吗?

感谢,

编辑:好吧,我修复了所有其他的测试失败,现在我只用System.AccessViolationException左边的人。

ADDED 安装过程形成我的测试:

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

     repository = MockRepository.GenerateStub<ISomeRepository>(); 

     someController = new SomeController 
      (repository); 

     controllerBuilder.InitializeController(someController); 
    } 
+0

如果您删除了outputchache属性,该测试是否通过? – David

+0

@Dvd - 具有相同属性的其他动作没有问题...但我会尝试......现在我只是在黑暗中拍摄,看看有什么命中。编辑:呃...相同的结果。 – AJC

+0

仅仅是为了确定,在单独运行时还是仅在整个套件运行时此测试失败? –

回答

3

找到了一个答案...真的很愚蠢的问题,像编程中的大多数问题。正如我总是说的,如果你在头几个小时内解决不了问题,那么你知道它真的很愚蠢。

这里就是我找到了答案,我花了一段时间,但问题的名称并没有帮助的事情之一:

Attempted to read or write protected memory

总之,我不得不更换MVCContrib的DLL。

感谢大家的帮忙...

+0

我很高兴你把它整理出来。你可以将你的回答标记为帮助解决问题的答案 –

+0

@Richard - 是的,但是我必须等待2天才能完成。该系统不会让我更早关闭它 – AJC

0

System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

当使用托管/非托管代码进行播放时,特别是在托管代码中分配非托管资源,并在托管代码仍然存在以访问操作系统正在发布的资源时,将它们释放得太早,此错误将出现在字段中。

您在[DllImport(...)]属性中正在使用IntPtr,或者有内存泄漏,或者extern COM/Win32函数声明不正确。

查找到代码更criticall & presizely

exceptionManager.HandleException(ex, FT_EXCEPTION_POLICY); 
+0

感谢您的回复......异常处理程序用于我的大多数操作中,其中很多都通过了。另外,我有一个单元测试用例,用于引发异常并正确传递。 – AJC

+0

注释了try catch,相同的结果...对我来说,它是一个非常简单的代码... – AJC

0

这可能是一个线程/竞争条件问题。

您并未在测试中创建控制器,某些控制器。因此,许多测试都使用相同的控制器实例,这可能会导致内存损坏错误。

尝试在每次测试中创建和配置控制器。

+0

即使我逐个运行测试,也会发生错误... – AJC

+0

它是否总是相同的测试那失败和通过相同? –

+0

是的,总是一样的......我花了最后几个小时寻找其中的一种模式,但无法找到一个... – AJC

相关问题