Подтвердить что ты не робот

В чем разница между моментом класса или интерфейса?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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