質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1895閲覧

swiftでの非同期処理のテストコードの書き方

oeiqgfodgfhps

総合スコア35

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/06/29 00:30

編集2020/06/30 02:30

自作アプリのテストコードを書きたいと思っています。
下記のようなFireStoreのデータを編集し、画面遷移をするコードのテストを下記場合は、どのように書くのが通例でしょうか?
一つの関数につき一つのテストという認識でしたが、これは一つの関数にデータの編集と画面遷移という二つのロジックが書かれているため、画面遷移の方を別の関数にまとめて、それぞれをテストした方がいいのでしょうか?
また、画面遷移のテストコードの書き方はどのように記述すればいいのでしょうか?調べてみましたが、自分では理解することが困難でした。
テストのことを全く考えずにコードを書いてしまったので、テストしやすいコードの書き方という観点からも、こういう書き方にするべきというご意見がありましたら、ご指摘お願いいたします。

swift

1 2import UIKit 3import FirebaseFirestore 4import Firebase 5 6class EditViewController: UIViewController,UITextFieldDelegate { 7 8 let db = Firestore.firestore() 9 var titleString = String() 10 var moneyString = String() 11 var descriptionString = String() 12 var documentIdString = String() 13 14 @IBOutlet weak var editButton: UIButton! 15 @IBOutlet weak var titleTextField: UITextField! 16 @IBOutlet weak var moneyTextField: UITextField! 17 @IBOutlet weak var descriptionTextField: UITextField! 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 titleTextField.text = titleString 21 moneyTextField.text = moneyString 22 descriptionTextField.text = descriptionString 23 moneyTextField.keyboardType = UIKeyboardType.numberPad 24 } 25 26 @IBAction func edit(_ sender: Any) { 27 let title = titleTextField.text 28 let money = moneyTextField.text! 29 let description = descriptionTextField.text 30 let data = ["title":title,"money":money,"description":description] as [String : Any] 31 var ref: DocumentReference? = nil 32 ref = db.collection("patiences").document("(documentIdString)") 33 ref?.updateData(data as [AnyHashable : Any]){ err in 34 if let err = err { 35 print("Error updating document: (err)") 36 } else { 37 print("Document successfully updated") 38 } 39 } 40 let indexVC = self.storyboard?.instantiateViewController(identifier: "index") as! IndexViewController 41 indexVC.modalPresentationStyle = .fullScreen 42 present(indexVC, animated: true, completion: nil) 43 } 44 45 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 46 if titleTextField.text == ""||moneyTextField.text == ""{ 47 editButton.isEnabled = false 48 }else{ 49 editButton.isEnabled = true 50 } 51 titleTextField.resignFirstResponder() 52 moneyTextField.resignFirstResponder() 53 descriptionTextField.resignFirstResponder() 54 return true 55 } 56 57 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 58 if titleTextField.text == ""||moneyTextField.text == ""{ 59 editButton.isEnabled = false 60 }else{ 61 62 editButton.isEnabled = true 63 } 64 titleTextField.resignFirstResponder() 65 moneyTextField.resignFirstResponder() 66 descriptionTextField.resignFirstResponder() 67 68

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayabusabusash

2020/06/30 00:33

テストコードというのはUnit TestのコードかUI Testのコードどちらでしょうか?
hayabusabusash

2020/06/30 01:08

返信ありがとうございます????‍♂️ あと確認ですが、上記のコードはどこかのViewControllerで実装されているコードでしょうか?
oeiqgfodgfhps

2020/06/30 02:31

ViewControllerの全てのコードを載せました
guest

回答1

0

ベストアンサー

質問欄に記載していただいたコードは ViewController 上の処理みたいですが、
以下のような問題が出てくると思います。

  • 画面の描画ではない処理が ViewController 上に実装されているのでテストが書きにくい
  • edit() が実行されると複数の処理( Firestoreへデータの追加、画面遷移 )が走る

この二つを解決するために自分なら MVC のような設計パターンを適応させて、
画面の描画関係以外の処理は Model に実装させ、ViewController は Model を保持するような作りにします。
まずはこの辺りを参考に MVC を適応させて、画面からビジネスロジックを切り離すような構成にするのはどうでしょうか?
非同期処理自体のテストはこちらの記事が参考になると思います。

また、画面遷移のテストについてですが、
画面遷移のテストは UI Test の範囲になると思うので、Unit Test で無理にテストする必要はないんじゃないかなと思います。

投稿2020/06/30 05:02

編集2020/06/30 05:06
hayabusabusash

総合スコア767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問