【问题标题】:How to properly abstract system objects when unit testing in C#?在 C# 中进行单元测试时如何正确抽象系统对象?
【发布时间】:2017-06-26 04:41:51
【问题描述】:

尽管我已经了解了可测试设计的模拟、存根和类抽象的原理,但我仍然不清楚。

使用 .NET,有很多内置类,例如 StackTrace,位于 Diagnostics 命名空间下。
其中一些类包含其他类的集合,这些类也包含其他类,等等等等…… - 包含原则。
例如:StackTrace 类包含一个由StackFrame 对象组成的数组,它本身有一个返回MethodBase 对象的方法。

假设这些类都不是抽象的,这意味着它们不能被直接模拟 - 如何设计代码来模拟这些类,不创建大量包装类并浪费大量时间就在上面

我希望我对那个足够清楚。

【问题讨论】:

  • 为什么要模拟StackTrace?您通常模拟 services - 而不是 StackTraceMethodBase 等数据对象。 (同样,你不必费心嘲笑集合、字符串等)
  • @JonSkeet StackTrace 类具有在内部读取文件的能力(这是一个 I/O,因此它是一种服务),因此必须对其进行模拟以避免文件系统依赖.如果我错了,请纠正我。
  • 仅当您使用它们的那个方面时。
  • 你所追求的几乎没有实用价值。 1)您不应该测试其他人的代码 2)您的二进制文件位于运行它们的磁盘上的某个位置,您的代码将在那里具有读/写访问权限,不是吗?那么允许StackTrace 完成它的工作有什么问题呢? StackTrace 公开了虚拟方法,因此要实现您的目标,您必须编写自己的继承自 StackTrace 的类并覆盖这些方法。
  • 这是一个实际问题还是假设问题?如果可行:您的测试用例和代码是什么?

标签: c# .net unit-testing nunit moq


【解决方案1】:

评论把我带到了 MSDN,在那里我发现这个问题是由于缺乏适当的研究而被问到的。
我所追求的所有方法都定义为virtual,因此 CAN 可以直接模拟。

注意:这仅回答问题中给出的具体示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2023-03-20
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多