是否应该在生产代码中使用 FluentAssertions?

Should FluentAssertions be used in production code?

我一直在使用 FluentAssertions 进行单元测试,并且想知道为什么它只在那个上下文中提到过。如果您通常使用保护编写快速失败的生产代码,您将不得不复制 FluentAssertions 已经提供的一些功能。我能想到的一些不使用它的原因:

  1. 它的重点是可读性,而不是性能。 Counter: 这不是高级语言也做的并且与警告不要过早优化有关吗?
  2. 也与性能有关,在发布模式下编译代码时,没有什么好的方法可以让某些断言不是 运行。计数器:您可以删除您认为不会在生产中发生但会导致难以追踪的异常的断言。只要它们不会显着影响性能,就不要管它。
  3. 它的断言并不总是抛出标准异常。例如,ArgumentNullExceptionArgumentException 无处不在且符合预期,但 FluentAssertions 不知道您正在测试参数并抛出一般异常。

也许它已经知道性能会受到显着影响,因此 #1 和 #2 是合法的,但您通常还需要快速单元测试,因此相同的逻辑可以在那里应用。还有其他不在生产代码中使用 FluentAssertions 的充分理由吗?

Fluent Assertions 仅针对单元测试和其他类型的测试提及,因为测试代码和生产应该分开。 例如。当你使用 Fluent Assertions 时,你不应该被迫依赖 Fluent Assertions 的测试依赖。

我无法回答 Fluent Assertions 是否慢,问题是它是否慢,这取决于场景。 对于单元测试,它的开销远远被可读性和改进的失败消息所覆盖。 在热循环中使用 Fluent Assertions 很容易破坏你的性能。 同样,这取决于使用 Fluent Assertions 中的哪个函数。例如。 BeEquivalentTo 严重依赖反射。

Debug.Assert 用于另一个但相关的目的。 它断言你的代码的状态,例如检查 invariants.