0
NSUserDefaultsにアイテムを保存するデモアプリケーションを作成しています。 iOSのUIテストは、次のようになります。iOS UIテストでNSUserDefaultsの項目が認識されない
@IBAction func saveButtonClicked() {
let user = User(username: self.usernameTextField.text!, password: self.passwordTextField.text!)
self.dataAccess.saveUser(user)
}
DATAACCESSクラスが以下に定義されています:
func test_should_create_account_successfully() {
app.textFields["usernameTextField"].tapAndType(text: "johndoe")
app.textFields["passwordTextField"].tapAndType(text: "password")
app.buttons["registerButton"].tap()
let users = dataAccess.getUsers()
XCTAssertTrue(users.count > 0)
}
registerButtonタップは、次のコードを解雇
func saveUser(_ user:User) {
user.userId = UUID().uuidString
var users = getUsers()
users.append(user)
let usersData = NSKeyedArchiver.archivedData(withRootObject: users)
// save the user
let userDefaults = UserDefaults.standard
userDefaults.setValue(usersData, forKey: "users")
userDefaults.synchronize()
}
func getUsers() -> [User] {
let userDefaults = UserDefaults.standard
let usersData = userDefaults.value(forKey: "users") as? Data
if usersData == nil {
return [User]()
}
let users = NSKeyedUnarchiver.unarchiveObject(with: usersData!) as! [User]
return users
}
問題がある次の行という常に0人のユーザーを返す:
let users = dataAccess.getUsers()
これは、iOS UI Testでのみ発生し、通常のUnit Testターゲットでは発生しません。
UPDATE:Userクラスは、互換性のNSCodingプロトコルである
public class User : NSObject, NSCoding {
var username :String!
var password :String!
var userId :String!
init(username :String, password :String) {
self.username = username
self.password = password
}
public func encode(with aCoder: NSCoder) {
aCoder.encode(self.userId,forKey: "userId")
aCoder.encode(self.username, forKey: "username")
aCoder.encode(self.password, forKey: "password")
}
public required init?(coder aDecoder: NSCoder) {
self.userId = aDecoder.decodeObject(forKey: "userId") as! String
self.username = aDecoder.decodeObject(forKey: "username") as! String
self.password = aDecoder.decodeObject(forKey: "password") as! String
}
}
ありがとうございますが、私はそれを試してみましたが、それは問題ではありませんでした。ユニットテストプロジェクト(iOS UIテストプロジェクトではありません)を使用すると、うまく永続化されるので、これはうまくコード化されています。 –
デバッグ用のUserdefaulsのすべてのキー値のペアを印刷してみてください。 –
NSUserDefaultsにアクセスすると、ターゲットの問題が深刻になると思います。奇妙な部分は、通常のiOSユニットテストプロジェクトが動作することです。 – azamsharp