Проблемы с началом работы с Moq и Nunit

Биться головой о стену, пытаясь заставить работать действительно простой сценарий тестирования. Я уверен, что мне не хватает чего-то очень простого!

Что бы я ни делал, я, кажется, получаю следующую ошибку из графического интерфейса NUnit при запуске теста с моей DLL: System.TypeLoadException: введите Castle.Proxies.ITestProxy из сборки DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null 'пытается реализовать недоступный интерфейс.

Я видел упоминание об этой ошибке в кучах мест при просмотре Stack Overflow и других местах, но решение, которое я все время нахожу, похоже, не помогает. И я на данном этапе даже не использую внутренний интерфейс! Решение, которое я вижу вокруг, тоже помещает следующую строку в AssemblyInfo.cs

[сборка: InternalsVisibleTo ("DynamicProxyGenAssembly2")]

Я использую:

  • Visual Studio 2010 Профессиональный
  • c# 4.0
  • Moq 4.10810.8 Beta (bin развернут)
  • NUnit 2.5.5 (установлен в GAC)

Все, что мне нужно сделать, чтобы воссоздать эту ошибку:

  1. Создать новый проект библиотеки классов
  2. Ссылка Moq и Unit (как указано выше)
  3. Создайте интерфейс. Я назвал свой интерфейс ITest, сделал его общедоступным, и у него есть один метод - string TestMethod ();. Для простоты делаю это в локальном проекте.
  4. Создайте класс под названием «Testing», украшенный [TextFixture], и ​​тестовый метод под названием «TestMethod», украшенный [Test]
  5. Соберите проект, затем запустите NUnit для полученной библиотеки DLL в папке Debug.

Вот содержимое моего тестового класса

namespace MoqTest {
[TestFixture]
public class Testing {
    [Test]
    public void TestMethod() {

        var testMock = new Mock<ITest>();
        testMock.Setup(x => x.TestMethod()).Returns("String val");
        var xyz = testMock.Object;

        Assert.AreEqual(1, 1);

    }
}

}

---- ОБНОВЛЕНИЕ --- После смены версии Moq с 4.10810.8 на 4.0.10501.6 все работает нормально!


person Brendan    schedule 12.08.2010    source источник


Ответы (3)


Следующий тест прошел для меня:

public interface ITest { string TestMethod(); }

public class Testing
{
    [Test]
    public void TestMethod()
    {
        var testMock = new Mock<ITest>();
        testMock.Setup(x => x.TestMethod()).Returns("String val");
        var xyz = testMock.Object;

        Assert.AreEqual(1, 1);
    }
}

Если ваш интерфейс является общедоступным и находится в той же сборке, проблем действительно возникнуть не должно. Я подозреваю, что вы просто где-то пропустили ключевое слово доступности, поскольку непубличный интерфейс действительно вызывает ошибку времени выполнения, потому что проксирующая сборка не сможет создать экземпляр типа на его основе.

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

Если вы все же вернетесь к внутреннему интерфейсу, обратите внимание, что ваш оператор InternalsVisibleTo должен находиться в той же сборке, что и ваш внутренний интерфейс, а не в тестовой сборке. Также обратите внимание, что если ваша сборка имеет строгое имя, вам может потребоваться добавить отпечаток открытого ключа для вашего InternalsVisibleTo утверждения, как описано в MSDN .

person ladenedge    schedule 13.08.2010
comment
Спасибо за ваши усилия, но даже ваш пример не подходит для меня с той же ошибкой. (В новом проекте / решении только с этим классом!) Так что либо мне не хватает чего-то еще очевидного, либо, возможно, это связано с версией Moq / NUnit / .NET Framework. Можете ли вы подтвердить, какие версии вы использовали для теста? - person Brendan; 13.08.2010
comment
В дополнение к этому тот же код, нацеленный на 3.5 с Moq 3.1.416, успешно проходит тест ... Поэтому очень хотелось бы знать, работает ли ваш пример с .NET Framework 4.0. - person Brendan; 13.08.2010
comment
Хорошо, поэтому, поигравшись, я обнаружил, что версия Moq имеет решающее значение. До сих пор я использовал 4.0.10810.8 и всегда вырабатывал эту ошибку. Как только я удалю ссылку на эту версию, а затем ссылку 4.0.10501.6, все станет зеленым! Так что спасибо ladenedge за ваш ответ, я отмечу его как ответ, потому что вы единственный, кто пытался мне помочь. - person Brendan; 13.08.2010
comment
Интересный. FWIW, я использовал .NET 4, NUnit 2.5.3.9345 и Moq 4.0.812.4. Может, есть ошибка в сборке 10810 Moq? ‹Shrug› В любом случае, рад, что вы нашли обходной путь! - person ladenedge; 13.08.2010
comment
Просто добавление [сборки: InternalsVisibleTo (DynamicProxyGenAssembly2)] сработало для меня. Спасибо! :) - person Rami A.; 20.12.2011

Да, у меня была такая же проблема с Moq.4.0.10810.8 для NET40 ... Когда я перешел на версию 4.0.10531.7, все снова стало зеленым!

person da2ce7    schedule 13.08.2010
comment
Спасибо! Я тоже пользуюсь этим, и последние два дня у меня была такая же проблема. Переход на более раннюю версию сразу решил эту проблему. - person reach4thelasers; 13.08.2010

Сейчас я использую 4.10.1, и у меня такая же проблема. Я попробовал перейти на 4.10.0, но безуспешно.

В конце концов я обнаружил, что, хотя интерфейс, который я использовал, был помечен как общедоступный, он был в классе без модификатора. Я нашел 2 вещи, которые заставили его работать:

1) Вытяните интерфейс за пределы класса. Поскольку класс больше не делал интерфейс внутренним, он стал доступен для сборки. 2) Отметьте класс как открытый. Поскольку все части пути к интерфейсу были помечены как общедоступные, сборка не имела проблем с доступом.

Эти стратегии работали как в 4.10.0, так и в 4.10.1.

person John Chesshir    schedule 12.12.2018