Проблемы с началом работы с 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.