- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试测试一段代码,我在其中检查一个帐户是否已经创建了一个 key 并将其存储在钥匙串(keychain)中。如果不是,它会调用启动 oauth 进程的方法。
我的第一个想法是覆盖我想在用户没有 key 的情况下调用的方法。但是我使用的是结构,因此无法继承和覆盖该方法。
如果我正在使用一个类,我会这样:
func testInitiateOauthCalledIfSecretKeyNotFound() {
class MockKeychainAccess: KeychainAccess {
var initiateAuthorizationWasCalled: Bool = false
override initiateAuthorization() {
initiateAuthorizationWasCalled = true
}
let keychainAccess = MockKeychainAccess()
keychainAccess.authorizeWithGoogle()
XCTAssertTrue(initiateAuthorizationWasCalled)
}
我还没有测试过这段代码,所以不确定它是否可以编译。但是从逻辑上讲,它似乎可以处理我要处理的情况。如果在 authorizeWithGoogle
方法中我们调用 initiateAuthorization()
那么我就会知道那已经发生了。但是,当他们使用结构时不能这样做,因为我们不能从结构继承。
请注意:我是 TDD 的新手,所以我可能以错误的方式思考这个问题。欢迎提出其他建议。但是我不想为了编写测试而从结构转换为类。我正在使用结构,因为我正在尝试变得更快速。
有谁知道我可以测试一个函数是否在结构中被调用的方法?
==========
编辑:
作为对 dasdom 回答的回应,我添加了一个我试图实现的一般方法的示例:
override func viewDidLoad() {
setupView()
let api = DataApi()
getData(api)
}
func setupView() {
tableView.dataSource = tableViewDataSource
}
func getData(api: DataApi) {
api.getApplicationData( { (objects) in
if let applications = objects as? [Application] {
self.tableViewDataSource.setApplicationItems(applications)
self.tableView.reloadData()
}
else {
// Display error
}
})
}
所以我想注入(inject) MockDataApi 以便它可以返回我想要的内容,因为该方法接受一种 DataApi 类型。但是我不确定我应该如何创建这个 MockDataApi 结构并将它传递给这个方法。
有人可以就如何为此目的构建和使用这个模拟对象提供帮助吗?我意识到它与协议(protocol)有关,但很难将其拼凑在一起。
最佳答案
使用协议(protocol)。使您的类/结构和测试模拟符合协议(protocol)。注入(inject)依赖项并断言在您的模拟中调用了预期的方法。
protocol DataApiProtocol {
func getApplicationData(block: [AnyObject] -> Void)
}
// Production code
struct DataApi: DataApiProtocol {
func getApplicationData(block: [AnyObject] -> Void) {
// do stuff
}
// more properties and methods
}
// Mock code
struct MockDataApi: DataApiProtocol {
var getApplicationDataGotCalled = false
func getApplicationData(block: [AnyObject] -> Void) {
getApplicationDataGotCalled = true
}
}
// Test code
func testGetData_CallsGetApplicationData() {
let sut = MyAwesomeClass()
let mockDataApi = MockDataApi()
sut.getData(mockDataApi)
XCTAssertTrue(mockDataApi.getApplicationDataGotCalled)
}
希望对您有所帮助。
关于ios - XCTestCase 检查一个方法是否在结构中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37321738/
我有两个 XCTestCase 子类, @interface SessionTest : XCTestCase @interface UserTest : XCTestCase 在 SessionTe
我在 XCTestCase 类中有几个测试用例,例如测试 1、测试 2 等我只想在 testPrecondition 通过时运行 test1, test2。我怎样才能做到这一点? 最佳答案 您必须覆盖
我在场景中有 XCTestCase 在XCTestCase 主体中,有一组测试用例。我只希望所有测试用例在第一个测试用例成功完成后开始的问题(在我的特殊目的中,第一个测试用例响应一个 token 供其
我正在为我的一个模型进行单元测试,该模型使用对我的 rest api 的异步调用。用于请求我的 API 的方法是这样的: requestOnComplete:(void(^)())complete o
我有一个 XCTestCase,但如果测试失败 - 应用会立即退出。我确实将此行更改为以下内容: continueAfterFailure = true 失败后它仍然退出应用程序。有谁知道如何在 UI
我需要测试一个 UIViewController,它的行为取决于给它的参数(控件是根据网络服务调用在 viewDidLoad 中动态实例化的)。 我将能够运行相同的 XCTestCase 派生类并注入
不知何故,我的 XCtestCase 类无法访问我项目中的类。是否有一种方法来检查测试文件是否与项目链接?如果是,在哪里检查? 最佳答案 选择要在测试用例中导入或使用的文件。在 Identity In
我正在编写一个在线和离线功能分离的应用程序。在这些功能中,我使用 Reachability 来检查互联网连接,并且在每种情况下(在线/离线),它都会执行不同的工作。 现在,我被要求为这些业务逻辑编写测
我正在使用 XCode 的 XCTestCase 进行自动化 UI 测试,以衡量我的应用程序的性能。我目前有一个包含 25 000 个元素的 UITable,当尝试运行应该滑动此列表的测试时,它会一直
我正在为一个白标项目编写 UI 测试,其中每个应用程序都有一组不同的菜单项。测试点击每个菜单项并截取屏幕截图(使用 fastlane snapshot )。 目前这一切都发生在一个名为 testScr
为什么我的可选实例变量是 nil,而实际上我将它设置为非 nil? 代码: class FooTests: XCTestCase { var foo: Int? func test_A
我的 UI 测试失败了,因为测试会无休止地等待,直到应用空闲。我看不到后台有任何事情发生,例如加载微调器。 它只出现在一个选项卡上。所有其他选项卡均可点击,但屏幕 3 上的测试失败。我在屏幕 3 上捕
我正在尝试测试一段代码,我在其中检查一个帐户是否已经创建了一个 key 并将其存储在钥匙串(keychain)中。如果不是,它会调用启动 oauth 进程的方法。 我的第一个想法是覆盖我想在用户没有
无法使用 xcodebuild test -scheme DollarTests -project Dollar.xcodeproj -configuration Debug -sdk macosx
我正在尝试为使用 Web 服务 API 的 iOS 客户端编写一些单元测试。我想使用实际服务而不是模拟数据。 在运行所有测试之前,我需要获取一个 token 来对用户进行身份验证。我正在尝试使用类 s
背景 以下测试调用 XCTestCase 扩展的方法。目标: waitForElementExists 方法因元素存在而返回,或者 waitForElementExists 方法调用它的测试用例/se
在 XCTestCase 期间,我想以某种方式说“禁用互联网”,它就会被有效地禁用。然后我想以某种方式说“启用互联网”,它就会回来。关键是要看到我的应用程序在网络请求失败然后成功时表现正常。做这个的最
我调用了一个 Restful API。我需要等待调用完成才能验证结果。很常见的问题,但我找不到关于如何将其合并到 XCTestCase 中的合适答案。我已经看到信号量、锁、for 循环都弄乱了代码来运
我在 xcode 中遇到了一些奇怪的问题。 我有一个项目,我决定添加一些单元测试。 我创建了新的测试包并将我的应用添加为测试目标。只是认为我更改为自动生成的代码是: Build Settings /
我正在尝试对 UIViewController 中的按钮点击接线进行单元测试,但我发现即使正在运行的应用程序中的代码工作正常,这些测试也会失败。 我通过删除 View Controller 简化了失败
我是一名优秀的程序员,十分优秀!