【问题标题】:What are NSubstitute limitations, specially vs MOQ?什么是 NSubstitute 限制,特别是与最小起订量相比?
【发布时间】:2016-01-18 09:12:22
【问题描述】:

我即将决定下一个项目的模拟库。

因为我是这些库的新手,所以我快速搜索了一下

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

但我更喜欢NSubstitute 语法,它还有一个不错的docs

所以我的问题是“有什么我可以使用MOQ 实现的我无法使用NSubstitute 实现的吗?”

【问题讨论】:

标签: .net unit-testing tdd moq nsubstitute


【解决方案1】:

我不知道 nsubstitute 的任何限制

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

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

【讨论】:

  • 与 Moq 相比,NSubstitute 有一点限制:它不能存根 protected 函数。当尝试替换HttpClient 中的HttpMessageHandler 时,这变得相关。可以做到这一点,但这是一个限制。
【解决方案2】:

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

例如:

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

我发现在起订量中更容易理解,因为您可以更轻松地阅读参数,而不必计算它是哪一个。

【讨论】:

    【解决方案3】:

    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 想象成“来自 mocks 的世界,给我 行为与此表达式匹配的人”。

    【讨论】:

    • 虽然它是一个班轮,但使用 NSubstitute 仍然比 Moq 可读
    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 2017-03-21
    • 2012-10-15
    • 2019-10-13
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多