由于System.AccessViolationException,NUnit测试失败

时间:2011-09-10 18:37:50

标签: c# unit-testing asp.net-mvc-3 nunit

我有一系列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);
    }

3 个答案:

答案 0 :(得分:3)

找到答案......真是愚蠢的问题,就像编程中的大多数问题一样。正如我经常说的那样,如果你在前几个小时内无法解决问题,那么你就知道它真的很蠢。

这是我找到答案的地方,花了我一段时间,但问题的名称也没有帮助:

Attempted to read or write protected memory

简而言之,我不得不更换MVCContrib Dlls。

感谢大家的帮助......

答案 1 :(得分:0)

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

当使用托管/非托管代码时,这个错误出现在一个字段中,特别是在托管代码中分配非托管资源并过早释放它们,当托管代码仍然存在以访问操作系统发布的资源时。

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

查看更关键的代码&amp; presizely

exceptionManager.HandleException(ex, FT_EXCEPTION_POLICY);

答案 2 :(得分:0)

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

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

尝试在每次测试中创建和处理控制器。