Каковы ограничения NSubstitute, особенно по сравнению с MOQ?

Я собираюсь принять решение о насмешливой библиотеке для моего следующего проекта.

и поскольку я новичок в этих библиотеках, я сделал быстрый поиск

Я обнаружил, что MOQ намного популярнее, чем NSubstitute, и я ожидаю дополнительной помощи от сообщества, особенно здесь, в SO

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

Итак, мой вопрос: "Есть ли что-нибудь, чего я могу добиться, используя MOQ? Я не могу добиться этого, используя NSubstitute?"


person George Botros    schedule 18.01.2016    source источник
comment
Этот пост может быть полезен, особенно раздел "Компромиссы NSubstitute".   -  person David Tchepak    schedule 19.01.2016


Ответы (3)


Я не знаю о каких-либо ограничениях nsubstitute

Несколько лет назад я был адептом moq, а теперь предпочитаю nsubstitute. Мне нравится синтаксис (вы вызываете непосредственно метод vs setup.), я думаю, что NSubstitute имеет лучший синтаксис и является наиболее читаемым из всех фреймворков (но это субъективное утверждение ^^).

О, может быть, одна вещь: NSubstitute не имеет строгого фиктивного режима (но я всегда думал, что это плохая идея, поэтому я никогда не рассматривал это как ограничение)

person rad    schedule 18.01.2016
comment
Существует небольшое ограничение NSubstitute по сравнению с Moq: он не может заглушать protected функции. Это становится актуальным при попытке заменить HttpMessageHandler на HttpClient. Это можно сделать, но это ограничение. - person Jerome Reinländer; 18.05.2020

Я заметил, что при попытке имитировать вызов метода в NSubstitute с помощью .Do() можно использовать параметры только как массив объектов. В Moq вы можете указать количество, типы и имена параметров.

Например:

  • NSubstitute: .Do(param => new ExObject{ s = (string) param[0], i = (int) param[1] })
  • Moq: .Callback‹ string, int>((text, nb) => new ExObject{ s = text, i = nb })

Мне было легче понять Moq, так как вы можете легче читать параметры, а не считать, какой именно.

person Cosmin    schedule 14.02.2019

https://github.com/moq/moq4#moq говорит:

Moq также является первой и пока единственной библиотекой, предоставляющей Linq to Mocks.

Например, такое же поведение в NSubstitute

var mockDateTimeProvider = Substitute.For<IDateTimeProvider>();
mockDateTimeProvider.Now.Returns(new DateTime(2020, 02, 28));

Можно выполнить в Moq в одну строку!

var mockDateTimeProvider = Mock.Of<IDateTimeProvider>(i => i.Now == new DateTime(2020, 02, 28));

Вы можете думать о Linq to Mocks как о «из вселенной моков, дайте мне тот, чье поведение соответствует этому выражению».

person dan    schedule 28.02.2020
comment
Хотя это один вкладыш, он все еще читаем с NSubstitute, чем с Moq. - person Navap; 13.09.2020