В чем разница между Moq-классом или интерфейсом? - PullRequest
18 голосов
/ 08 декабря 2008

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

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

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

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

Ответы [ 2 ]

16 голосов
/ 11 декабря 2008

Насмешка над классом совершенно допустима. Однако с помощью MoQ вы можете только имитировать виртуальные методы и свойства в классе.

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

1 голос
/ 08 декабря 2008

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

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

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