Проблемы с началом работы с Moq и Nunit - PullRequest
14 голосов
/ 13 августа 2010

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

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

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

в следующей строке

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

Я использую:

  • Visual Studio 2010 Professional
  • с # 4,0
  • Moq 4.10810.8 Beta (бен развернут)
  • NUnit 2.5.5 (установлен в GAC)

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

  1. Создать новый проект библиотеки классов
  2. Ссылка Moq и Единица (как указано выше)
  3. Создать интерфейс. Я назвал свой интерфейс ITest, сделал его общедоступным, и у него есть один метод - string TestMethod (); Я делаю это в местном проекте для простоты.
  4. Создайте класс с именем «Тестирование», украшенный [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 все работает отлично!

Ответы [ 3 ]

6 голосов
/ 13 августа 2010

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

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);
    }
}

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

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

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

4 голосов
/ 13 августа 2010

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

0 голосов
/ 12 декабря 2018

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

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

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

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

...