什么是NSubstitute限制,特别是对MOQ?

时间:2016-01-18 09:12:23

标签: .net unit-testing tdd moq nsubstitute

我即将为我的下一个项目做出关于模拟库的决定。

因为我是那些图书馆的新手,所以我快速搜索了

我发现MOQNSubstitute更受欢迎,我期待社区提供更多帮助,特别是在这里

但我更喜欢NSubstitute语法,还有一个很好的docs

所以我的问题是“我是否可以使用MOQ来实现使用NSubstitute无法实现的目标?”

3 个答案:

答案 0 :(得分:33)

我不知道nsubstitute的任何限制

几年前,我是moq的擅长者,现在我更喜欢nsubstitute。我喜欢语法(你直接调用方法vs setup。),我认为NSubstitute具有最好的语法,并且是所有框架中最具可读性的(但这是一个主观断言^^)。

哦,也许有一点:NSubstitute没有严格的模拟模式(但我一直认为这是一个坏主意,所以我从未将其视为限制)

答案 1 :(得分:2)

我注意到,当尝试使用.Do()在NSubstitute中模拟对方法的调用时,只能将参数用作对象数组。在Moq中,您可以强制参数的数量,类型和名称。

例如:

  • NSubstitute:.Do(param => new ExObject {s =(string)param [0],i =(int)param [1]})
  • Moq:.Callback <字符串,整数>(((text,nb)=>新的ExObject {s =文本,i = nb})

我发现在Moq中更容易理解,因为您可以更轻松地读取参数,而不必计算其中的一个。

答案 2 :(得分:1)

https://github.com/moq/moq4#moq说:

Moq也是迄今为止第一个也是唯一一个向Mocks提供Linq的库

例如,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是“从模拟世界中,给我 行为与该表达式匹配的人。”