静态对象状态如何在 MSpec 上下文之间共享/设置?

2024-01-06

在编写一些 MSpec BDD 测试时,我遇到了一个场景,其中我预计会失败的测试通过了,但只有当我运行所有测试时才通过。当我单独运行测试时,它按预期失败了。经过一番调查后,我发现在第二个测试运行之前,上一个测试中设置的某些状态没有被重置,这导致第二个测试在我预期失败时通过。以下人为的代码重现了该场景:

public class ContextBase
{
    protected static object state;
}

public class Context_a : ContextBase
{
    Establish context = () => { state = new object(); };

    It should_set_state = () => state.ShouldNotBeNull();
}

public class Context_b : ContextBase
{
    Establish context = () => {  };

    It should_set_state = () => state.ShouldNotBeNull();
}

这两个测试都通过了,因为 Context_a 在 Context_b 之前执行,并且在执行 Context_B 时,在 Context_A 中设置的状态仍然设​​置。如果您单独运行 Context_B,则测试会失败,因为状态尚未设置。有趣的是,如果您从 Context_B 中删除空的 Eastern 语句,那么 Context_B 将始终按预期失败。

我对 MSpec 比较陌生,这种行为让我感到惊讶。我假设这样的状态会在执行每个上下文之间重置。也许我错过了一些东西......我是否正确构建了这些测试?如果 MSpec 不会在上下文之间自动重置这样的状态,那么我应该使用什么策略来确保在像我的示例中那样的情况下重置状态?我是否应该在 ContextBase 类上放置一个 Implement lambda 将所有状态字段设置为 null?


MSpec 不会“重置”执行上下文之间的静态状态。它遵循您从普通静态变量中了解到的行为,即它们不会在应用程序(即测试运行)运行时重新初始化,除非您手动执行此操作。最好初始化中的所有字段Establish每个上下文。

另一种选择是额外添加一个Establish在您的基类上,但这将从您的上下文中隐藏重要信息 - 您必须导航到基类才能看到某个字段已使用特定值初始化。但 DRY 不适用于一般测试:我更喜欢使用基类protected static我从派生上下文调用的方法(请参阅这个答案 https://stackoverflow.com/a/2842244/149264举个例子)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态对象状态如何在 MSpec 上下文之间共享/设置? 的相关文章

  • 动画 UICollectionView contentOffset 不显示不可见单元格

    我正在开发一些类似股票行情的功能 并且正在使用UICollectionView 它最初是一个滚动视图 但我们认为集合视图将使添加 删除单元格变得更容易 我使用以下内容对 collectionView 进行动画处理 void beginAni
  • ffmpeg在音频concat命令中创建图像幻灯片

    我有一个有效的 ffmpeg 当它在 Windows 10 命令提示符下运行时 会将 3 个音频文件和 1 个图像文件组合成一个视频 单个图像文件在整个视频持续时间内仅用作静态图像 16 50 或 1010 秒 song1 mp3 00 0
  • 是否可以拥有来自同一基类的不同对象的数组?

    我正在尝试为游戏设计武器类别 这是我为满足我的需求而编写的一些代码 class weapon public int fireRate int bulletDamage int range ofImage sprite ofImage bul
  • 在栈和堆上创建对象数组

    考虑以下代码 class myarray int i public myarray int a i a 如何在堆栈上创建 myarray 对象数组以及如何在堆上创建对象数组 You can create an array of object
  • CountDownTimer 继续在后台滴答作响 — 如何在 onResume 中检索该计数?

    我有一个带有多个计时器的应用程序 当我启动一个时 我可以在 Eclipse 的 Logcat 中看到它倒计时 When I hit the Back button onStop is called in the app but the ti
  • python 3.4 和 3.5 之间的协程,如何保持向后兼容性?

    我正在开发 python 聊天机器人框架asyncio 但我看PEP 492 https www python org dev peps pep 0492并且有新的语法 async await最后它接受了 I like async awai
  • F# 中没有构造函数的类

    我不确定为什么 F 似乎允许定义没有任何构造函数的类 我的意思是 实例化该类的对象是不可能的 语言规范不应该将其视为非法行为吗 例如 我可以定义类 type myClass class member this x 0 end myClass
  • 在 Swiper.js 最后一张幻灯片之后继续滚动

    我需要一些有关 Swiper js 的帮助 我有一个正在开发的网站https www paradev co uk ee live home alt https www paradev co uk ee live home alt 我想要发生
  • 结构参数的默认值

    假设我有以下结构 struct myStruct int x int y int z int w 我想在调用以下函数时将此结构初始化为默认值 如果有帮助 我正在寻找一个简单的零初始化 void myFunc myStruct param 0
  • 我怎样才能把日期和时间选择器放在android的对话框中

    我是 Android 新手 正在努力解决如何添加这两个date picker and time picker在一个单一的dialog box请指导我该怎么做我创建了一个dialog box并使用一个函数setview给它充气 但我得到了例外
  • CQ 工作流程,“Handler Advance”的目的?

    我正在 Adob e CQ 5 4 中使用一些自定义 WorkflowProcess 类 当我将工作流程步骤配置为工作流程模型的一部分时 有一个标题为 处理程序前进 检查您的处理程序是否将前进到下一步 的复选框 我的 Java 类实际上确实
  • Node.js + MySQL - 处理事务

    我正在使用express和node mysql驱动程序在node js上构建一个应用程序 当我需要进行一系列数据库插入 更新时 我的应用程序中有几种情况 我希望它们在一个事务中 这样如果第二个或第三个失败 以前的插入将完全回滚 目前 我这样

随机推荐