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

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

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

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

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

Я использую:

  • Visual Studio 2010 Professional
  • С# 4.0
  • Moq 4.10810.8 Бета (развернутый бит)
  • NUnit 2.5.5 (установлен в GAC)

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

  • Создайте новый проект библиотеки классов
  • Ссылка Moq и единица (как указано выше)
  • Создайте интерфейс. Я назвал свой интерфейс ITest, сделал его общедоступным и имеет один метод, который является "string TestMethod();". Я делаю это в локальном проекте для простоты.
  • Создайте класс под названием "Тестирование", украшенный [TextFixture] и тестовый метод "TestMethod", украшенный [Test]
  • Создайте проект, затем запустите 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);

    }
}

}

---- UPDATE --- После изменения версии Moq с 4.10810.8 до 4.0.10501.6 все работает отлично!

Ответы

Ответ 1

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

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.

Ответ 2

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

Ответ 3

Я использую 4.10.1 сейчас, и я получил эту же проблему. Я попытался понизить до 4.10.0, но безрезультатно.

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

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

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