gpt4 book ai didi

ios - Swift:使用 NSNotificationCenter 进行测试

转载 作者:行者123 更新时间:2023-11-28 07:15:58 27 4
gpt4 key购买 nike

我正在尝试通过 NSNotificationCenter 发送消息来测试我的应用程序,就像应用程序接口(interface)所做的那样。

问题是从 TestCase 类发帖。相同的代码适用于在应用程序内发帖,但如果从单元测试发帖会导致应用程序崩溃。

为了测试这种情况,我制作了一个简单的 SingleWindow 应用程序。添加此 Message 类以通过 postNotification 的 userInfo 参数传递消息:

class Message {
var text:String = "Hi"
}

在ViewControler上添加了messageHandler,像这样

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
NSNotificationCenter.defaultCenter().addObserver(self, selector:"messageHandler:", name:"WhatEverMessage", object:nil)

//Send message to be catched on MessageHandler func.
var userInfo = ["Message": Message()];
NSNotificationCenter.defaultCenter().postNotificationName("WhatEverMessage",object:self, userInfo:userInfo);
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func messageHandler(notification:NSNotification){

let message = notification.userInfo!["Message"] as Message
println((message as Message).text)

}
}

当应用程序运行时,viewDidLoad 方法为自己发送一条消息,并在 messageHandler 处成功解包

当我尝试通过从 TestCase 发送另一条消息来测试行为时,应用程序崩溃了。要发布的代码完全相同:

func testExample() {
var userInfo = ["Message": Message()];
NSNotificationCenter.defaultCenter().postNotificationName("WhatEverMessage",object:self, userInfo:userInfo);
}

当我运行测试时,我在发布消息时收到 EXC_BREAKPOINT 异常,但没有为项目设置断点,然后我收到 EXC_BAD_ACCESS,在 messageHandler 上展开消息。

我认为问题出在从测试用例发帖但没有任何线索时。所有编译和链接设置在这个测试项目中都是默认的。

已经尝试了很多东西,比如从 NSObject 派生 Message 和其他不太有意义的东西。卡在这里。

最佳答案

问题在于 Message 类的使用方式。 Message 类被设置为测试目标的一部分。这样,当目标编译时,它会创建一个新的 Message 类。因此,当 messageHandler 尝试将对象转换为 Message 类时,它失败了,因为该对象具有目标的 Message 类。

要在测试函数上使用 Message 对象,应该从目标成员中删除 Message 类并改为导入。

此处代码更改:

public class Message {
public init(){ //Initializer must be declared to make it public
}
public var text:String = "Hi"
}

在测试端:

import XCTest
import MyApp

class MyAppTests: XCTestCase {

...

func testExample() {
var userInfo = ["Message": MyApp.Message()]; //Specify namespace MyApp
NSNotificationCenter.defaultCenter().postNotificationName("WhatEverMessage",object:self, userInfo:userInfo);
}
}

关于ios - Swift:使用 NSNotificationCenter 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26204932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com