MOQ 4.0: инициализатор типа для 'Moq.Mock`1' выдал исключение - PullRequest
6 голосов
/ 02 октября 2010

Я получаю исключение

Инициализатор типа для 'Moq.Mock`1' выдал исключение.

с использованием Moq 4.0, который я проверялна нескольких форумах, и они ссылаются на использование версии Moq-NoCastle.Я попробовал и это, и версию в папке Moq.Оба с одинаковым результатом.

У меня есть решение с 2 проектами, один для моего интерфейса, один для моих тестов.В моем основном проекте есть 2 файла:

IMyInterface.cs:

using System;

namespace Prototype
{
    public interface IMyInterface
    {
        int Value { get; set; }
        void ProcessValue();
        int GetValue();
    }
}

В моем файле program.cs есть только код по умолчанию, сгенерированный с проектом.

Мой тестВ проекте есть один файл для моего фиктивного теста - TestProgram.cs

using System;
using NUnit.Framework;
using Moq;

namespace Prototype.UnitTests
{
    [TestFixture]
    public class TestProgram
    {
        Mock<IMyInterface> mock;

        [TestFixtureSetUp]
        void TestSetup()
        {
            mock = new Mock<IMyInterface>();
            mock.Setup(x => x.GetValue()).Returns(2);
        }

        [Test]
        public void RunTest()
        {
            IMyInterface obj = mock.Object; /* This line fails */
            int val = obj.GetValue();
            Assert.True(val == 2);
        }
    }
}

В соответствии с документацией все хорошо и правильно, и хорошо компилируется.Проблема возникает, когда я пытаюсь запустить тест.Он попадает на отмеченную выше строку и вылетает за исключением:

Инициализатор типа для 'Moq.Mock`1' выдал исключение.

Не могуПосмотрите, что здесь происходит, кто-нибудь может пролить свет на это?

Ответы [ 4 ]

8 голосов
/ 26 января 2017

Это произошло со мной, когда я обновил пакет Castle.Core NuGet до версии 4.0.0.Что-то изменилось, что не работает должным образом с последним Moq (v4.5.30) на данный момент.

Я решил это, вернувшись к Castle.Core версии 3.3.3 .

4 голосов
/ 02 октября 2010

Мне удалось успешно запустить тест после внесения следующих изменений:

  1. Сделано TestSetup() общедоступно
  2. В RunTest, изменено int val = obj.Value на int val = obj.GetValue()- это было просто для того, чтобы передать Assert.

Я не знаком с NUnit (я использую xUnit), но я предполагаю, что TestSetup () был проблемой приватности.Когда этот метод является закрытым, NUnit показывает для меня это исключение:

Prototype.UnitTests.TestProgram.RunTest:
Invalid signature for SetUp or TearDown method: TestSetup

Возможно, вы используете более старую версию NUnit, которая по-разному обрабатывает эту ситуацию (я только что скачал 2.5.7.10213).

* НТН * 1019

3 голосов
/ 22 ноября 2018

У меня было похожее исключение с Moq (ранее оно работало нормально).

Для меня решение было использовать NuGet для удаления Moq и сборки, о которой упоминалось исключение.А затем переустановите Moq с помощью NuGet и примените все последующие обновления NuGet.

0 голосов
/ 30 апреля 2019

У меня также была эта проблема с использованием Moq, но немного отличающаяся от Ричарда.

Моя ошибка была следующей.

Сообщение: System.TypeInitializationException: инициализатор типа для 'Moq.Mock`1 'выбросил исключение.---- System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'Microsoft.AspNetCore.Razor.Runtime, версия = 2.1.1.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60'.

вВ моем случае мне не пришлось удалять Mock, устанавливать недостающую сборку в правильной версии.Я не знаю, почему это было только проблемой сейчас.Проблема произошла после слияния веток, но обе ветви не имели ни сборок, ни ранее не показывали эту ошибку.Однако конец хорошему все хорошо.

...