2008-12-08 3 views
17

Я использовал moq, чтобы издеваться над объектами в своих модульных тестах, и я видел на сайте про moq, что он может издеваться над обоими классами и интерфейсами.В чем разница между моментом класса или интерфейса?

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

У меня на самом деле не было ответа на этот вопрос .... и я не могу найти ответа на это на сайте moq.

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

ответ

16

Издевательство над классом совершенно справедливо. Вместе с MoQ вы можете только имитировать виртуальные методы и свойства в классе.

Это полезно, когда у вас есть абстрактные базовые классы вместо интерфейсов или классы с реализацией по умолчанию и виртуальные в качестве точек расширения. Существует много случаев, когда у вас нет доступа к исходному коду классов, которые вам нужно высмеять. Существует много примеров в .Net framework, например. MembershipProvider.

1

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

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

Смежные вопросы