我有一系列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 :(得分: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)
这可能是线程/竞争条件问题。
您没有在测试中创建控制器,某些控制器。因此,许多测试都使用相同的控制器实例,这可能导致内存损坏错误。
尝试在每次测试中创建和处理控制器。