【问题标题】:NUnit test fails because of System.AccessViolationException由于 System.AccessViolationException,NUnit 测试失败
【发布时间】:2011-11-14 11:39:02
【问题描述】:

我进行了一系列 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 了。

添加 我的测试中的设置过程:

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

        repository = MockRepository.GenerateStub<ISomeRepository>();

        someController = new SomeController
            (repository);

        controllerBuilder.InitializeController(someController);
    }

【问题讨论】:

  • 如果您删除 outputchache 属性,此测试是否通过?
  • @Dvd - 具有相同属性的其他动作通过没有问题......但我会尝试......现在我只是在黑暗中拍摄,看看会发生什么。编辑:不...相同的结果。
  • 只是为了确定,这个测试是在单独运行时失败还是仅在整个套件运行时失败?
  • @Lieven - 两种情况...现在我发现一些其他测试因其他原因而失败,修复后现在失败并出现同样的异常...感谢上帝的电脑不是任天堂控件,原因我的现在已经坏了……
  • 让我们尝试向月球射击。你以前测试过吗?您是否对视图、绑定或资源进行了任何更改?您是否错过了附加到该 VM 的控件所需的一些资源?

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


【解决方案1】:

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

在使用托管/非托管代码时出现此错误,尤其是在托管代码中分配非托管资源并过早释放它们时,托管代码仍然存在以访问操作系统正在释放的资源。

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

更严格、更准确地查看代码

exceptionManager.HandleException(ex, FT_EXCEPTION_POLICY);

【讨论】:

  • 感谢您的回复...异常处理程序用于我的大多数操作中,其中许多都通过了。另外,我有一个单元测试用例,用于说明何时引发异常并正确通过。
  • 注释掉了try catch,同样的结果...让我觉得它是一个非常简单的代码...
【解决方案2】:

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

您不是在创建控制器,而是在测试中创建某个控制器。因此,许多测试都使用同一个控制器实例,这可能会导致内存损坏错误。

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

【讨论】:

  • 失败的和通过的总是相同的测试吗?
  • 是的,总是一样的...过去几个小时我一直在寻找其中的模式,但找不到...
  • 你能添加一个传递给你的问题的问题
  • 还有仓库和一些控制器的声明
  • 刚刚添加了您要求的声明...我将添加一个通过示例,除了您可以进行相同的测试,因为其他测试几乎相同,通过...
【解决方案3】:

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

这是我找到答案的地方,花了我一段时间,但问题的名称也无济于事:

Attempted to read or write protected memory

简而言之,我必须更换 MVCContrib Dll。

感谢大家的帮助...

【讨论】:

  • 很高兴您解决了问题。您能否将您的回答标记为答案以帮助结束问题
  • @Richard -是的,但我必须等待 2 天才能完成。系统不允许我提前关闭它
猜你喜欢
  • 2019-04-24
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2022-06-14
相关资源
最近更新 更多