为什么在 Quick 单元测试中会多次调用 before- 和 afterEach 块?

2024-06-30

我编写了一个测试用例,其中包含一些示例组,包括beforeEach and afterEach。 我期望每个beforeEach and afterEach每个都会被调用一次it.

唉,对于一个人来说it the beforeEach and afterEach被多次打电话。

我查看了一些文档(即 Quick 自己的文档和http://jasmine.github.io/2.1/introduction.html http://jasmine.github.io/2.1/introduction.html),但这些对我的事业没有帮助。

这是一个小片段,演示了这一点:

类 CheckerTests: QuickSpec {

override func spec() {

    describe("something") {
        beforeEach {
            tLog.info("describe before")
        }
        afterEach {
            tLog.info("describe after")
        }

        context("of something") {
            beforeEach {
                tLog.info("context before")
            }
            afterEach {
                tLog.info("context after")
            }

            it("should behave like something") {
                tLog.info("in the `IT`")
                expect(true).to(beTrue())
            }
        }
    }

}

}


我的控制台日志:

上述日志提出了两个问题:

  • 我不知道when beforeEach and afterEach现在被召唤;我也不知道为什么我看到多个日志调用它们。为什么他们会被多次调用?

- The above logs show that the context's after block is called before the example passes...shouldn't that happen after the example?

从我的代码片段中,我希望日志返回:

有人能解释一下这里发生了什么吗?这是正确的行为吗?


EDIT:

正如评论所建议的;我还添加了一个日志inside the it示例(请参阅上面修改后的代码片段)。 这给了我以下日志:

Test Suite 'CheckerTests' started at 2017-05-18 13:35:29.025
Test Case '-[CheckerTests something__of_something__should_behave_like_something]' started.
13:35:29.046 ???? INFO CheckerTests.spec():21 - describe before
13:35:29.046 ???? INFO CheckerTests.spec():21 - describe before
13:35:29.048 ???? INFO CheckerTests.spec():29 - context before
13:35:29.048 ???? INFO CheckerTests.spec():29 - context before
13:35:29.048 ???? INFO CheckerTests.spec():36 - in the `IT`
13:35:29.048 ???? INFO CheckerTests.spec():36 - in the `IT`
13:35:29.049 ???? INFO CheckerTests.spec():32 - context after
1Test Case '-[CheckerTests something__of_something__should_behave_like_something]' passed (0.024 seconds).
3:35:29.049 ???? INFO CheckerTests.spec():32 - context after
13:35:29.050 ???? INFOTest Suite 'CheckerTests' passed at 2017-05-18 13:35:29.050.
     Executed 1 test, with 0 failures (0 unexpected) in 0.024 (0.025) seconds
 CheckerTests.spec():24 - describe after
13:35:29.050 \360\237\222Test Suite 'CheckerTests.xctest' passed at 2017-05-18 13:35:29.051.
     Executed 1 test, with 0 failures (0 unexpected) in 0.024 (0.026) seconds
\231 INFO CheckerTests.spec():24 - describe after
Test Suite 'Selected tests' passed at 2017-05-18 13:35:29.051.
     Executed 1 test, with 0 failures (0 unexpected) in 0.024 (0.029) seconds

上面的日志显示该示例运行了两次,这让我更加困惑。


EDIT:
其中一个问题已得到解答:

- The above logs show that the context's after block is called before the example passes...shouldn't that happen after the example?

测试似乎按正确的顺序进行,因此回答了上述问题。


EDIT:

以供参考;这就是我的 Podfile 的样子:

def pods_for_testing
    pod 'Quick'
    pod 'Nimble'
    pod 'KIF'
end

target 'Checker' do
  project 'Checker.xcodeproj', 'dev' => :debug, 'ntrl' => :debug, 'acpt' => :release, 'prod' => :release, 'prod appstore' => :release

  pod 'SQLCipher'
  pod 'UrbanAirship-iOS-SDK'
  pod 'TBXML', :inhibit_warnings => true
  pod 'SSZipArchive'
  pod 'Google/Analytics'
  pod 'Moya', '>= 8.0'
  pod 'Unbox'
  pod 'ProcedureKit'
  pod 'ProcedureKit/Mobile'
  pod 'SwiftyBeaver'
  pod 'OHHTTPStubs'
  pod 'OHHTTPStubs/Swift'

  target 'CheckerTests' do
      inherit! :search_paths
      pods_for_testing
  end

  target 'CheckerUITests' do
      inherit! :search_paths
      pods_for_testing
  end

end

除此之外,我不确定还有哪些其他设置可能会影响测试。


我尝试重现该问题。但就我而言,每个测试用例都只执行一个。

因此,该问题在正常设置中似乎无法重现。可能您有一些特殊设置导致了上述问题。

Note:
我不确定您还需要哪些其他库来获取“tLog.info”,但我找不到。我认为这对于这个目的来说并不重要。我用 print(_:) 语句代替。

这是我的“TryQuickTest.swift”:

import XCTest
import Quick
import Nimble 

class TryQuickTest: QuickSpec {

    override func spec() {

        describe("blah") {
            beforeEach {
                print("describe before")
            }
            afterEach {
                print("describe after")
            }

            context("of blah2") {
                beforeEach {
                    print("context before")
                }
                afterEach {
                    print("context after")
                }

                it("first it should be like this") {
                    print("in the first `IT`")
                    XCTFail("Hey fail in first it")
                }

                it("second it should be like this") {
                    print("in the second `IT`")
                    XCTFail("Hey fail in second it")
                }
            }
        }   
    }    
}

我的控制台用于运行此测试文件:

Test Suite 'Selected tests' started at 2017-05-28 07:35:32.345
Test Suite 'PlayQuickTests.xctest' started at 2017-05-28 07:35:32.347
Test Suite 'TryQuickTest' started at 2017-05-28 07:35:32.348
Test Case '-[PlayQuickTests.TryQuickTest blah__of_blah2__first_it_should_be_like_this]' started.
describe before
context before
in the first `IT`
/Users/shisui/Developer/General/iOS_Swift/PlayQuick/PlayQuickTests/TryQuickTest.swift:35: error: -[PlayQuickTests.TryQuickTest blah__of_blah2__first_it_should_be_like_this] : failed - Hey fail in first it
context after
describe after
Test Case '-[PlayQuickTests.TryQuickTest blah__of_blah2__first_it_should_be_like_this]' failed (0.004 seconds).
Test Case '-[PlayQuickTests.TryQuickTest blah__of_blah2__second_it_should_be_like_this]' started.
describe before
context before
in the second `IT`
/Users/shisui/Developer/General/iOS_Swift/PlayQuick/PlayQuickTests/TryQuickTest.swift:40: error: -[PlayQuickTests.TryQuickTest blah__of_blah2__second_it_should_be_like_this] : failed - Hey fail in second it
context after
describe after
Test Case '-[PlayQuickTests.TryQuickTest blah__of_blah2__second_it_should_be_like_this]' failed (0.003 seconds).
Test Suite 'TryQuickTest' failed at 2017-05-28 07:35:32.359.
    Executed 2 tests, with 2 failures (0 unexpected) in 0.007 (0.010) seconds
Test Suite 'PlayQuickTests.xctest' failed at 2017-05-28 07:35:32.359.
    Executed 2 tests, with 2 failures (0 unexpected) in 0.007 (0.012) seconds
Test Suite 'Selected tests' failed at 2017-05-28 07:35:32.374.
    Executed 2 tests, with 2 failures (0 unexpected) in 0.007 (0.029) seconds

从上面的输出来看。每个测试用例仅执行一次。

如果我删除第二个“it”部分。控制台输出如下所示:

Test Suite 'Selected tests' started at 2017-05-28 07:56:09.214
Test Suite 'PlayQuickTests.xctest' started at 2017-05-28 07:56:09.215
Test Suite 'TryQuickTest' started at 2017-05-28 07:56:09.215
Test Case '-[PlayQuickTests.TryQuickTest blah__of_blah2__first_it_should_be_like_this]' started.
describe before
context before
in the first `IT`
/Users/shisui/Developer/General/iOS_Swift/PlayQuick/PlayQuickTests/TryQuickTest.swift:35: error: -[PlayQuickTests.TryQuickTest blah__of_blah2__first_it_should_be_like_this] : failed - Hey fail in first it
context after
describe after
Test Case '-[PlayQuickTests.TryQuickTest blah__of_blah2__first_it_should_be_like_this]' failed (0.006 seconds).
Test Suite 'TryQuickTest' failed at 2017-05-28 07:56:09.222.
    Executed 1 test, with 1 failure (0 unexpected) in 0.006 (0.007) seconds
Test Suite 'PlayQuickTests.xctest' failed at 2017-05-28 07:56:09.224.
    Executed 1 test, with 1 failure (0 unexpected) in 0.006 (0.009) seconds
Test Suite 'Selected tests' failed at 2017-05-28 07:56:09.224.
    Executed 1 test, with 1 failure (0 unexpected) in 0.006 (0.011) seconds
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Quick 单元测试中会多次调用 before- 和 afterEach 块? 的相关文章

  • Android 本地测试与仪表测试

    我正在尝试检查我的 API 在单元测试中是否可用 以确保它响应 200 现在 我的问题是我不太确定何时使用本地测试当我必须使用时Android 仪器测试 我知道我必须使用 Instrumented Tests 进行 UI 测试 但如何测试端
  • CAShapeLayer 具有边框、填充颜色和舍入

    如何使用 CAShapeLayer 绘制一条同时具有边框颜色 边框宽度和填充颜色的线条 这是我尝试过的 但它只是蓝色的 self lineShape strokeColor UIColor blueColor CGColor self li
  • 在旧版 iOS 模拟器上运行时 Xcode 10 测试失败 - “无法加载测试包...找不到合适的图像”

    我已经安装了 Xcode 10 并将我的 iOS 应用程序升级到 Swift 4 2 当我通过 Xcode 在运行 iOS 12 的 iPhone 模拟器上运行测试 UI 和 Unit 时 测试成功启动 当我尝试在运行先前 iOS 版本 例
  • 如何在表格视图中对图像进行动画处理以同时扩展和打开另一个视图控制器?

    我正在制作一个消息应用程序 我希望用户单击我的表格视图中的图像 它应该扩展到全屏并在导航栏上显示不同的控件 我该怎么办 我想我可以拍摄相同的图像 将 UIImageView 放在原始单元格图像之上并将其动画化为全屏 但是我如何在没有闪烁 延
  • 删除第一个注释-MapView iOS

    我正在从事地图视图项目 我有关于从地图视图中删除注释的问题 我已经实现了以下代码 但它随机删除注释 而不是第一个 mapView removeAnnotation self mapView annotations objectAtIndex
  • Xcode 7.3.1 UITests 代码覆盖率始终为 0%

    除了主应用程序之外 我的项目中还有两个单独的单元测试和 UI 测试目标 这两个目标有不同的方案 以便我可以分别在我的 CI 服务器上运行它们 我在这两个方案中都检查了 收集代码覆盖率 最初 我通过使用 Cmd U 分别构建和运行这两个方案来
  • 在故事板中创建自定义 UITableview 部分标题的最佳方法

    目前 我正在故事板中创建一个原型单元 并使用该单元作为节标题 在 tableView viewForHeaderInSection 方法中 我使单元格出队并返回它 我的节标题单元格中有一个 UITextField 和一个 UIButton
  • 在 UITextView 内画一条线 - NSAttributedString

    我想在里面画一条可定制的线UITextView由一些文本组成 使用NSAttributedString 这是我尝试过的 NSString unicodeStr NSString stringWithFormat C C C 0x00A0 0
  • 使用 NSPredicate 进行反向字符串比较

    我一直在互联网上寻找这个答案 但到目前为止还没有运气 所以我需要咨询这里聪明又友善的人 这是我第一次在这里提问 所以我希望我做得正确 不要重复这个问题 对于我看到的所有示例 搜索字符串是核心数据中存储的内容的子字符串 另一方面 我想实现以下
  • Reactive Cocoa - 以编程方式设置文本时,不会调用 UITextView 的 rac_textSignal

    我正在实现一个聊天 UI 并使用 Reactive Cocoa 在用户键入时调整聊天气泡的大小 目前 我正在根据 textview 更新 UI 的布局rac textSignal 一切都工作得很好 除了一点 当用户sends消息中 我以编程
  • Swift 错误:“找不到‘SKScene’的接口声明,其超类”

    免责声明 我通读了类似的问题 找不到解决我的问题的方法 我想将 SKScene 的子类添加到以前未使用 SpriteKit 的项目中 该项目是 ObjC 和 Swift 的混合体 子类是用 Swift 编写的 我做了什么 通过转到项目 gt
  • Xcode 4.3.2 足以为 iOS 6 构建应用程序吗?

    在今天宣布 iOS 6 Beta 可供开发人员使用之后 我想知道如果我尽快使用 iOS 6 我是否仍然能够在我的设备 iPhone 上从 Xcode 4 3 2 构建正在进行的应用程序 或者 Xcode 也需要更新吗 更新 目前我的 iPh
  • 应用程序大小限制和查找应用程序的大小

    好吧 我读过无数地方说应用程序大小限制是 20 MB 有些说是 50 MB 是哪一个 更重要的是 我当前的应用程序在管理器的存档部分中的 估计应用程序商店大小 为 106 1mb 然而 当我将它分发到一个临时文件时 它会以 ipa 的形式出
  • 导航标题颜色更改问题

    当我弹出控制器时 我面临的导航标题颜色没有改变 请找到下面的代码 ProfilescreenVC swift override func viewWillAppear animated Bool super viewWillAppear a
  • WKScriptMessageHandler 不会侦听网页上按钮元素上的“onclick”或“click”事件。网页是使用Reactjs开发的

    我正在使用一个WKWebView在 UIViewController 的视图中使用 url 端点显示托管在服务器上的网页 该网页使用Reactjs 这就是我所掌握的有关该网页的所有信息 该代码创建一个 Web 视图并将该 Web 视图作为控
  • 删除 iOS 中不需要的字符

    我正在填充地址簿中的所有联系人 我必须仅向服务器发送没有国家 地区代码且没有任何特殊字符和空格的电话号码 即纯电话号码 但我的地址簿电话号码采用不同的格式 如下所示 91 99 70 044099 125 91 8605 681220 91
  • AVAudioSequencer 导致 Deinit/Segue 崩溃:“所需条件为 false:outputNode”

    每当对象被取消初始化时 例如 当执行展开转回到另一个 ViewController 时 以下代码会导致崩溃并出现以下错误 所需条件为 false AVAudioEngineGraph mm 4474 GetDefaultMusicDevic
  • 通话期间未调用远程通知回调

    我创建了一个应用程序 其中后台获取代码是在接收推送通知时编写的 我已在 plist 中启用后台模式 推送通知负载中的内容可用键设置为 1 注册推送通知并使用委托 void application UIApplication applicat
  • 单元测试依赖注入

    我在用Autofac for IoC 这是我的容器启动器类 其职责是注册依赖项 public class ContainerInit public static IContainer BuildContainer var conFac ne
  • Swift - 将 HTML 文本转换为属性字符串

    在我的一个模块中 我想使用 UILabel 将多语言 HTML 文本 英语和泰米尔语 显示为 NSAttributedString 如果文本是纯英文 我可以按照我的愿望显示它 但我的内容同时包含英语和泰米尔语字符 我该如何处理这种情况 如果

随机推荐

  • Visual Studio 2019中Python UnitTest下没有测试

    我在 Visual Studio 2019 Version16 3 9 中有一个现有的 python 项目 其中包含在 Visual Studio 2017 下为 unittest py 创建的单元测试 我已经为 unittest 配置了该
  • 是否可以向 ZeroMQ 添加事件处理以在接收/发送数据时进行操作?

    我在Linux Ubuntu 中用C 创建了两个不相关的守护进程 这些进程处于睡眠模式 只有在接收到数据时才会被唤醒 并且执行信号处理程序中实现的操作并再次休眠 我已经使用 SIGNAL IPC 和消息队列实现了这种通信 在发送消息之前 我
  • Admob WP8 System.UnauthorizedAccessException

    我正在使用 VS2012 开发 WP8 应用程序 我希望添加 Admob 横幅广告 不幸的是它引发了异常 导致我的应用程序冻结 为了捕获此 admob 异常 我必须禁用 仅我的代码 VS2012 设置 并且在执行以下代码后 我在最后一行收到
  • 你能以编程方式调用 Siri 吗?

    我想创建一个 UITextView 的子类 其中包含一个自定义按钮来调用 Siri 用于其语音到文本的文本输入 这可能吗 我不介意是否显示键盘 我只想提供自己的按钮来打开 Siri 不幸的是 你不能这样做 从 iOS 6 0 开始 使用 S
  • 为什么要关闭 System.Diagnostics 跟踪自动刷新?

    在我所有的应用程序中 我总是设置
  • 我们可以使用 Azure Web App 设置 FTP 站点吗?

    对于 FTP 和 Azure 来说是全新的 所以如果这个问题听起来很愚蠢 请原谅 有没有办法使用 Azure Web App 服务设置 FTP 有可能吗 我试图避免使用带有 IIS 的专用虚拟机来设置 FTP 我所有的搜索结果都是使用 FT
  • 如何在 Node 中发送 OAuth 请求

    我想访问node js中的WS REST API 我有oauth consumer key和oauth token和 API 端点 oauth signature method 是 HMAC SHA1 如何在 Node 中发送 OAuth
  • Reload $(document).ready(function() ajax页面重新加载后

    我有一个通用的js文件 在ajax请求中重新加载html页面后 我无法访问该文件中的函数 即之间的常见JS函数 文档 ready 函数 如何访问它们并触发公共文件中的函数Example 常见的JS document ready functi
  • Qiskit Nature VQE 打印全量子电路

    我正在使用 Qiskit Nature 进行 VQE 我想看看我的最终量子电路是什么样子的 如何打印整个量子电路 如 ansatz 您可以使用construct circuit方法 例如 假设您安装了最新的 Qiskit 版本 from q
  • 示例代码详细说明了 Ada 和 Java 之间的打字差异 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试想一个很好的例子来详细说明 Ada 的严格类型和 Java 的强类型之间的区别 有谁有一个很好的例子来使用基于整数的值来识别
  • R 在列中按分隔符分割字符串

    我有一个包含几行的文件 例如 A B C awer ttp net Code 554 abcd ttp net Code 747 asdf ttp net Part 554 xyz ttp net Part 747 我想使用 R 仅拆分表的
  • 两个同时发生的事件

    我在这个页面上使用了一段JS代码http 200tr ru app admin http 200tr ru app admin 当我按下十字符号时 会发生 2 个事件 模糊和单击 但仅运行模糊代码 我需要反点击交叉代码 我怎样才能做到这一点
  • JS:event.touches 属性如何工作?

    我不明白如何使用 event touches 属性 例如 要获取 iPad iPhone 上的手指数量 您应该使用 event touches length 那么为什么这个示例代码不起作用呢 image bind touchstart fu
  • 如何在 SQL Server 中引用触发器的“新”、“旧”行?

    所以我是 SQLite 的 SQL Server 新手 我习惯使用 New Old 关键字 我看到有些人使用insertedvalue 引用新创建的行 但这仅适用于插入而不适用于更新 我能得到类似的东西吗New我在这个查询中使用 creat
  • 如何在 React-native 中绘制其他应用程序

    我试图在我的 React Native 应用程序中创建类似 Facebook Messenger 的聊天头 我使用平移响应器来创建拖动效果并折叠为副作用 但我无法弄清楚如何使聊天头在其他应用程序或手机主屏幕上可见 我的应用程序包含 SYST
  • 根据类名查找 div id

    我必须根据它的类找到div id 如果div有名为searchItemSelected的类 那么如何获取它的div id div class CheckinWithUserRow1 searchItemSelected style heig
  • Django 的 self.client.login(...) 在单元测试中不起作用

    我通过两种方式为单元测试创 建了用户 1 为 auth user 创建一个固定装置 大致如下所示 pk 1 model auth user fields username homer is active 1 password sha1 72
  • 从外部 webpack 导入(运行时导入)

    这只是我今天想到的 我没有看到很多信息 所以我将分享这个weird案例以及如何我个人解决了它们 如果有更好的方法请评论 但同时这可能会帮助其他人 在 webpack 包中 每个import require你做的 是由 webpack 使用其
  • 如何在 VS Code 中禁用烦人的突出显示

    正如标题所说 我只是想知道如何在 VS Code 中禁用这个烦人的突出显示 当我在括号内输入内容时 我想立即得到建议 但首先我得到一个恼人的突出显示 除非我按 ESC 键 否则它不会消失 正如您在图像中看到的 首先 console log
  • 为什么在 Quick 单元测试中会多次调用 before- 和 afterEach 块?

    我编写了一个测试用例 其中包含一些示例组 包括beforeEach and afterEach 我期望每个beforeEach and afterEach每个都会被调用一次it 唉 对于一个人来说it the beforeEach and