Сбой теста NUnit из-за исключения System.AccessViolationException - PullRequest
6 голосов
/ 10 сентября 2011

У меня есть серия тестов 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);
    }

Ответы [ 3 ]

3 голосов
/ 11 сентября 2011

Нашел ответ ... действительно глупая проблема, как и большинство проблем в программировании. Как я всегда говорю, если вы не можете решить эту проблему в первые пару часов, то вы знаете, что это действительно очень глупо.

Вот где я нашел ответ, занял у меня некоторое время, но название вопроса тоже не помогло:

Попытка чтения или записи в защищенную память

Короче, мне пришлось заменить MVCContrib Dlls.

Спасибо всем за помощь ...

0 голосов
/ 11 сентября 2011

Это может быть проблема состояния потока / гонки.

Вы не создаете контроллер, какой-то контроллер в тесте. Поэтому во многих тестах используется один и тот же экземпляр контроллера, это может привести к ошибкам повреждения памяти.

Попробуйте создать и утилизировать контроллер внутри каждого теста.

0 голосов
/ 10 сентября 2011

System.AccessViolationException: попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.

Эта ошибка возникает в поле при игре с управляемым / неуправляемым кодом, особенно при выделении неуправляемых ресурсов в управляемом коде и их освобождении слишком рано, когда управляемый код все еще существует длядоступ к ресурсам, освобождаемым операционной системой.

Вы используете IntPtr ненадлежащим образом, или у вас есть утечка памяти, или объявление внешних функций COM / Win32 неверно, f / e в [DllImport (...)] attribute.

Изучите код более критично и надёжно

exceptionManager.HandleException(ex, FT_EXCEPTION_POLICY);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...