Как имитировать защищенных виртуальных участников с помощью Rhino.Mocks?

Moq позволяет разработчикам имитировать защищенных участников. Я искал ту же функциональность в Rhino.Mocks, но не нашел.

Вот пример со страницы Moq Quick Start, как имитировать защищенный метод.

// at the top of the test fixture
using Moq.Protected()

// in the test
var mock = new Mock<CommandBase>();
mock.Protected()
     .Setup<int>("Execute")
     .Returns(5);

// if you need argument matching, you MUST use ItExpr rather than It
// planning on improving this for vNext
mock.Protected()
    .Setup<string>("Execute",
        ItExpr.IsAny<string>())
    .Returns(true);

Дайте мне знать, если я гонюсь за чем-то, что не выходит.


person Vadim    schedule 05.04.2010    source источник
comment
Возможно, вы захотите проверить эту ссылку geekswithblogs.net/MattRobertsBlog/archive/2008/12/16/   -  person juharr    schedule 04.03.2011
comment
Это не совсем подходящее решение - необходимость изменить исходный класс, чтобы предоставить метод внутренне другим классам, означает, что вы изменяете свой дизайн в соответствии с требованиями тестирования. Неприятный запах для меня.   -  person Stephen Drew    schedule 21.11.2011


Ответы (2)


Я считаю, что этой функции нет в Rhino Mocks.

Почему вы пытаетесь издеваться над защищенными участниками? Почему бы просто не протестировать класс в целом? В качестве альтернативы вы можете создать подкласс своего тестового класса и вручную создать «имитирующие» защищенные методы.

person Grzenio    schedule 07.04.2010
comment
В настоящее время я создаю подклассы SUT и издеваюсь над защищенным членом. Мне было интересно, есть ли что-то вроде Moq, которое спасло бы меня от создания подклассов. Я приму ваш ответ, если у Rhino.Mocks нет этой функции. - person Vadim; 08.04.2010
comment
Потому что сейчас у Microsoft есть такие вещи. ... защищенный внутренний виртуальный OkResult Ok () {} - person Alex Nolasco; 03.07.2014

Мы создаем метод protected как internal, а затем открываем внутреннее устройство для проекта модульного тестирования и имитаций rhino, добавляя следующие строки в ваш AssemblyInfo:

[assembly: InternalsVisibleTo("YourNamespace.TestProjectName")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

работает для нас

person keith    schedule 18.09.2012
comment
Кейт, спасибо, но я искал другое решение, а затем изменил свой AssemblyInfo. КСТАТИ. Около 5 лет назад я создал утилиту, которая генерирует для вас код InternalVisibleTo. Это может сэкономить вам время. Вы можете найти его здесь: vkreynin.wordpress .com / 2007/12/09 / - person Vadim; 18.09.2012
comment
@Vadim, милое спасибо, я считаю, что VS2012 позволяет вам издеваться над чем угодно, поэтому эта проблема может не существовать для следующего поколения модульных тестов! - person keith; 19.09.2012