如何使用闭包创建单元测试用例

     2023-02-24     11

关键词:

【中文标题】如何使用闭包创建单元测试用例【英文标题】:How to create unit test cases with closures 【发布时间】:2020-07-29 12:31:52 【问题描述】:

我已经在我的应用程序中创建了单元测试用例,到目前为止还不错。我在我的项目中使用 MVVM 并且我的 API 请求具有 success & failureclosures。我怎样才能为此制作测试用例。

我尝试了什么:

var mockAPIService: MockApiService!

override func setUp() 
  super.setUp()
  mockAPIService = MockApiService()
  sut = PhotoListViewModel(apiService: mockAPIService)


func test_fetch_photo() 
  sut.apiSuccessClouser =  dataValue in
    print("apiSuccessClouser") // This doesnot executes 
    XCTAssert(dataValue)
  

但是print("apiSuccessClouser") 没有执行.. 我只是在寻找 make clouser 与单元测试一起工作。

【问题讨论】:

请分享您要测试的代码大纲,而不仅仅是您的测试代码。目前尚不清楚您要测试什么,任何可能的答案都取决于此。 【参考方案1】:

将 dataValue 存储在某个变量中,并使用期望等待您的闭包执行然后进行测试。注意:这个例子是用swift 4编写的

let yourExpectationName = expectation(description: "xyz")
var dataToAssert = [String]() //replace with you data type
sut.apiSuccessClouser =  dataValue in
      dataToAssert = dataValue
      yourExpectationName.fulfill()
 
    
waitForExpectations(timeout: 3)  (error) in //specify wait time in seconds
    XCTAssert(dataToAssert)

【讨论】:

谢谢.. expectation 替换为 XCTestExpectation 并且有效。顺便问一下,您能否更新答案我们如何使用 Quick/Nimble 来做到这一点?【参考方案2】:

MockApiService 中的apiSuccessClouser 是闭包(()->Void?)? 类型的属性。

sut.apiSuccessClouser = ... 行中,您为属性 apiSuccessClouser 分配了一个闭包,但您从未访问此闭包以便执行 print("apiSuccessClouser")

要执行 print("apiSuccessClouser") 你需要调用闭包

sut.apiSuccessClouser?()

所以像这样重构测试:

func test_fetch_photo() 
  sut.apiSuccessClouser =  dataValue in
  print("apiSuccessClouser") // This doesnot executes 
  XCTAssert(dataValue)
 
sut.apiSuccessClouser?()

更多信息:https://docs.swift.org/swift-book/LanguageGuide/Closures.html

【讨论】:

【参考方案3】:

要使用 vanilla XCTest 测试这种异步代码,您需要使用 XCTestExpectation

func test_fetch_photo() 
  let expectation = XCTestExpectation(description: "photo is fetched")

  sut.apiSuccessClouser =  dataValue in
    // I like to run the assertions directly inside of the async closure, that way
    // you don't need to have vars around to store the value in order to check it
    // afterwards
    XCTAssert(dataValue)

    expectation.fulfill()
  

  sut.apiSuccessClouser?()

  // The timeout duration depends on what kind of async work the closure is doing,
  // here, because it's called directly, you probably don't need long.
  wait(for: [expectation], timeout: 0.1)

断言库Nimble 还提供了一种测试异步代码的简洁方法。

func test_fetch_photo() 
  waitUntil  done in
    self.sut.apiSuccessClouser =  dataValue in
      assert(dataValue).toNot(beNil())
      done()
    

    self.sut.apiSuccessClouser?()
  

除了waitUntil,Nimble 还有一个.toEventually assertion。

您也询问过使用Quick。 Quick 是一个测试 harness 库,它允许您以不同的方式编写测试,但它不会影响您编写实际期望的方式。

describe("Name of your system under test") 
  it("does something asynchronously") 
    let sut = ...
    
    waitUntil  done in
      self.sut.apiSuccessClouser =  dataValue in
        assert(dataValue).toNot(beNil())
        done()
      

      self.sut.apiSuccessClouser?()
    
  

【讨论】:

如何使用 Jasmine 为以下 javascript 函数编写单元测试用例

】如何使用Jasmine为以下javascript函数编写单元测试用例【英文标题】:HowtowriteUnitTestCaseforbelowjavascriptfunctionusingJasmine【发布时间】:2019-04-1303:24:37【问题描述】:如何使用Jasmine为下面的javascript函数编写单元测试用例?functionGetURL... 查看详情

在nodejs中为持久功能活动创建单元测试用例

...【发布时间】:2022-01-0820:58:44【问题描述】:我正在尝试使用nodejs为持久功能活动创建单元测试。但是没有找到任何关于那个或任何东西的文件。我缺乏的地方是我不知道在创建测试用例时要通过什么上下文。任何帮助将不胜感... 查看详情

如何使用 Kafka Streams 为应用程序编写单元测试用例

】如何使用KafkaStreams为应用程序编写单元测试用例【英文标题】:HowtowriteunittestcaseforapplicationusingKafkaStreams【发布时间】:2021-08-2114:52:06【问题描述】:我们正在构建一个将使用KafkaStreams的应用程序。我们正在寻找示例示例,该... 查看详情

如何使用 Angular 4 Jasmine 单元测试用例覆盖 IF/ELSE 条件

】如何使用Angular4Jasmine单元测试用例覆盖IF/ELSE条件【英文标题】:HowtocoverIF/ELSEconditionwithAngular4Jasmineunittestcase【发布时间】:2018-05-2419:55:23【问题描述】:帮助我覆盖IF/Else覆盖范围和返回HTTP响应的方法以及构造函数以覆盖Jasmin... 查看详情

如何设计单元测试用例

如何编写单元测试用例(白盒测试)。一、单元测试的概念        单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正... 查看详情

如何在 iOS swift 中制作登录屏幕的单元测试用例

】如何在iOSswift中制作登录屏幕的单元测试用例【英文标题】:HowcanimakeunittestcasesofLoginscreeniniOSswift【发布时间】:2019-05-0209:33:16【问题描述】:我在登录屏幕上遇到问题。如何使用登录屏幕制作单元测试用例?我有一个带有操... 查看详情

java盲点攻克「testng专题」摒弃junit单元测试,带你学会使用testng测试框架(上篇)(代码片段)

...例Java直接运行xml方式运行TestNG的注解运行结果如下:如何创建TestNG测试集合?如何配置testNG.xml文件?测试用例的分组(group)执行多组分组时配置如下(两种形式都可以):依赖测试(dependsOnMe... 查看详情

我需要为 Swift 中的结构创建单元测试用例类吗?

】我需要为Swift中的结构创建单元测试用例类吗?【英文标题】:DoIneedtocreateaUnitTestCaseclassforaStructinSwift?【发布时间】:2020-02-2514:52:25【问题描述】:我想知道是否需要创建一个单元测试用例类甚至一个单独的单元测试方法来测... 查看详情

使用 FakeItEasy 的私有方法和属性的单元测试用例 [重复]

...Easy[duplicate]【发布时间】:2015-08-1416:00:21【问题描述】:如何使用FakeItEasy框架测试私有方法和属性【问题讨论】:为什么要测试私有方法?这些应该是实现细节,你应该通过测试你的类的行为来测试它们。如果你想提供模拟值 查看详情

unittest单元测试框架总结(代码片段)

...试用例是否通过,最终生成测试结果。今天笔者就总结下如何使用unittest单元测试框架来进行WEB自动化测试。目录一、unittest模块的各个属性说明二、使用unittest框架编写测试用例思路三、使用unittes 查看详情

如何在 Angular 7 中使用 Karma/Jasmine 为 App_Initializer 编写单元测试用例

】如何在Angular7中使用Karma/Jasmine为App_Initializer编写单元测试用例【英文标题】:howtowriteunittestcasesforApp_InitializerusingKarma/Jasmineinangular7【发布时间】:2019-06-3002:41:22【问题描述】:我已经在我的app.module.ts文件中导入了APP_INITIALIZER... 查看详情

如何在 Spring Boot 应用程序中为带有 @Configuration 注释的类编写单元测试用例

】如何在SpringBoot应用程序中为带有@Configuration注释的类编写单元测试用例【英文标题】:HowtowritetheunittestcasefortheClasseswhichareannotatedwith@ConfigurationinSpringBootapplication【发布时间】:2020-05-2619:08:47【问题描述】:我有一个配置类,它... 查看详情

为 Preact 编写单元测试用例

...相同的用途,但我每次都会遇到错误。谁能推荐一些关于如何在Preact上编写单元测试用例的博客或教程?【问题讨论】:什么错误给了你?现在我正在研究使用酶,因为第3版已经 查看详情

如何使用 c# 为给定函数创建负 nunit 测试用例

】如何使用c#为给定函数创建负nunit测试用例【英文标题】:Howtocreatenegativenunittestcaseforthegivenfunctionusingc#【发布时间】:2021-12-2422:21:04【问题描述】:数据库接口:publicinterfaceIDatabase:List<string>GetXmlNames(stringOrderNumber);数据库... 查看详情

如何在 jasmine 中编写单元测试用例?

】如何在jasmine中编写单元测试用例?【英文标题】:Howtowriteunittestcaseinjasmine?【发布时间】:2021-07-1110:27:36【问题描述】:Flag(a)letelement=this.selected.filter(item=>item.a===a)returnelement.length>1?true:false;不确定如何为上述函数编写单元... 查看详情

如何使用 angular9 和 Jasmine 为所有组件生成 .pdf 格式的单元测试用例代码覆盖率报告

】如何使用angular9和Jasmine为所有组件生成.pdf格式的单元测试用例代码覆盖率报告【英文标题】:Howtogenerateunittestcasecodecoveragereportin.pdfforallcomponentsusingangular9andJasmine【发布时间】:2021-06-2104:04:18【问题描述】:.html格式的Angular支... 查看详情

如何在主应用程序目标中使用单元测试用例(作为 test_spec 添加到开发 pod)?

】如何在主应用程序目标中使用单元测试用例(作为test_spec添加到开发pod)?【英文标题】:Howtouseunittestcases(addedtoadevelopmentpodastest_spec)inthemainapptarget?【发布时间】:2018-08-2812:44:51【问题描述】:假设我有一个podDevelopmentPod。在... 查看详情

如何在订阅Angular7单元测试用例中对代码进行单元测试

】如何在订阅Angular7单元测试用例中对代码进行单元测试【英文标题】:HowtounittestcodeinsidesubscribeforAngular7unittestcase【发布时间】:2019-09-1411:10:24【问题描述】:我想对所有代码进行单元测试并获得覆盖率,但我无法获得订阅内存... 查看详情