Moq как вы тестируете внутренние методы?

Мой босс сказал использовать Moq, и все. Мне это нравится, но кажется, что в отличие от MSTest или mbunit и т. д., вы не можете тестировать внутренние методы.

Поэтому я вынужден опубликовать некоторую внутреннюю реализацию в моем интерфейсе, чтобы я мог ее протестировать.

Я что-то упускаю?

Можете ли вы протестировать внутренние методы с помощью Moq?

Большое спасибо


person Community    schedule 22.09.2009    source источник
comment
Moq не является альтернативой MSTest или mbunit. они оба являются фреймворком для модульного тестирования, тогда как Moq — это макетирующий фреймворк. хотя почти всегда используется вместе, это две очень разные вещи. кстати +1 вашему боссу, Moq отличный ;-)   -  person Adam Ralph    schedule 30.12.2009


Ответы (6)


Вы можете использовать атрибут InternalsVisibleTo, чтобы методы, видимые для Moq.

Отн. ="noreferrer">http://geekswithblogs.net/MattRobertsBlog/archive/2008/12/16/how-to-make-a-quotprotectedquot-method-available-for-quotpartialquot-mocking-and-again.aspx

person Robert Harvey    schedule 22.09.2009
comment
Это необходимо для сборок со строгими именами. [assembly:InternalsVisibleTo(DynamicProxyGenAssembly2,PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7)] - person Brad Irby; 07.09.2011

Нет ничего плохого в том, чтобы сделать внутренние компоненты видимыми для других классов для тестирования. Если вам нужно протестировать внутренности класса, обязательно сделайте это. Тот факт, что методы не являются общедоступными, не означает, что вы должны игнорировать их и тестировать только общедоступные. Хорошо спроектированное приложение на самом деле будет иметь большую часть кода, инкапсулированного в ваши классы таким образом, что они не будут общедоступными. Так что игнорирование непубличных методов в вашем тестировании - большая ошибка ИМХО. Одна из прелестей модульного тестирования заключается в том, что вы тестируете все части своего кода, независимо от того, насколько они малы, и когда все ваши тесты запущены и работают на 100 %, вполне разумно предположить, что, когда все эти части собраны вместе, ваш приложение будет работать правильно для конечного пользователя. Конечно, проверка этой последней части - это то, где вступают тесты уровня интеграции - это другое обсуждение. Так что тестируйте!!!

person jle    schedule 30.12.2009

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

Как сказано в другом ответе, для этого вы можете использовать атрибут InternalsVisibleTo. Но это не значит, что вы должны это делать.

person eglasius    schedule 22.09.2009
comment
Разве смысл модульного тестирования не в том, чтобы тестировать все? Тестирование внутренних/приватных методов может выявить проблемы, а тестирование общедоступных может и не выявить. Тем более, что новые публичные функции добавляются и используют внутренние... или я что-то упускаю? - person CodeRedick; 02.03.2012

С моей точки зрения, Mocking следует использовать для имитации некоторого поведения, от которого мы зависим, но не собираемся его тестировать. Следовательно:

В: Я что-то упустил? - Нет, вы ничего не упускаете, в MOQ отсутствует возможность издеваться над личным поведением.

В: Можете ли вы протестировать внутренние методы с помощью Moq? - Если результат частного поведения виден публично, то да, вы можете протестировать внутренний метод, но вы не можете протестировать их из-за Moq. Я хотел бы отметить здесь, что Mock — это не способность тестировать, а скорее способность к аналогичному поведению, которое мы не тестируем, но от которого зависим.

C: Основное преимущество TDD заключается в том, что ваш код становится легко изменить. Если вы начинаете тестировать внутренности, то код становится жестким и трудно поддающимся изменениям — я не согласен с этим комментарием по двум основным причинам: 1: Это не заблуждение новичка, поскольку TDD — это не только возможность писать код быстрее, но и также более качественный код. Следовательно, чем больше тестов мы сможем сделать, тем лучше. 2: Это не усложняет изменение кода, если вы каким-то образом можете протестировать внутренние методы.

person user1840652    schedule 21.11.2012

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

Конечно, могут существовать случаи, когда частные методы следует тестировать изолированно, но в 99% случаев частные методы тестируются неявно, потому что они заставляют общедоступные методы пройти свои тесты. Публичные методы вызывают приватные методы.

Частные методы существуют по какой-то причине. Если они не приводят к внешнему тестируемому поведению, то они вам не нужны.

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

Основное преимущество TDD заключается в том, что ваш код становится легко изменить. Если вы начинаете тестировать внутренности, то код становится жестким и его трудно изменить.

person Tormod    schedule 14.11.2009

InternalsVisibleTo — ваш друг для тестирования внутренних компонентов. Не забудьте подписать свои сборки, и вы в безопасности.

person kzu    schedule 27.04.2010