Как я могу издеваться над внутренним интерфейсом, используя NMock2?
Если я попробую это, я просто получу исключение:
System.TypeLoadException : Access is denied: 'Namespace.IInternalInterface'.
Обнародование интерфейса не является приемлемым решением. Я не хочу менять видимость моего API, чтобы протестировать его.
2 ответа
Решение
Я нашел ответ на это:
NMock2, (и другие насмешливые фреймворки). Создает фиктивные объекты в динамически генерируемых сборках. Для того, чтобы макетная среда создавала фиктивный объект, внутренние компоненты должны быть видны этим сборкам.
Просто добавьте следующие объявления в класс AssemblyInfo.cs для тестируемого модуля:
// Allow unit test and mock assemblies to see internal members.
[assembly: InternalsVisibleTo("MyAssembly.UnitTest")]
[assembly: InternalsVisibleTo("NMock2")]
[assembly: InternalsVisibleTo("Mocks")]
[assembly: InternalsVisibleTo("MockObjects")]
Нашел и задокументировал решение.
http://www.rhyous.com/2012/05/03/nmock2-internal-interface/
Оказывается, что более новая версия NMock2 (я получил ее здесь: NMock2 Project) нужна только одна, и она другая.
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]