###### tags: `學期 3` # Debugging Q&A [toc] ## 1. by 小鹿 - 自定義 helper 跑不過 R05 測試 Unit 121 :https://lighthouse.alphacamp.co/courses/118/units/25571 R05 測試檔案: https://lighthouse.alphacamp.co/courses/118/assignments/3569 有改 helper ,自行設定的 helper 無法通過 小鹿的 code: https://github.com/tkoleo84119/forum-express-grading/commit/65a6a5716c6bdc5ae87c18375d978193283eb79c  ### Answer 這裡與測試程式有關 從 req.user 得到的資料內容由這段程式定義 R05.test.js  在程式中取得的結果為 ```javascript= { FavoritedRestaurants: [] } ``` 但若是從 helpers.getUser(req) 得到的資料內容則由這段程式定義 R05.test.js  這段模擬了 helpers.getUser 的 return 結果,在測試程式執行的情況下,並不會真正進入 helpers.getUser 方法執行,而是直接依據設置的 returns 返回 ```javascript= { id: 1, Followings: [], FavoritedRestaurants: [] } ``` 依照這樣的邏輯,使用 helpers.getUser(req) 在這裡才是正確的做法,但是測試卻無法通過 原因在於 unitTestHelper.js 模擬 Model.destroy 的邏輯  46 行的目的是想從餐廳關聯的 FavoritedUsers 中移除該使用者ID,從而在之後查詢時,該餐廳的追蹤數就會減少 這裡注意白底 UserId 的大小寫 再看 R05.test.js 塞入的模擬資料  由於大小寫差異,導致原本應該移除 userId 為 1 的資料沒有被移除 誤打誤撞,使用 req.user.id 取得的值為 undefined,反而成功移除這筆資料 除錯的過程可以作為參考,了解為什麼發生這個錯誤即可 再請測試開發團隊修正 ## 2. by CH Lin npm run test 前面有出現正常測試結果,但最後出現下圖訊息,想問助教這些內容是什麼意思  ## 3. by 高明 本地運行都沒問題,但測試檔就有錯誤,請問要如何解讀這段錯誤訊息  對應的程式碼是 1. res.render.getCall(0).args[1].restaurants[1].favoritedCount.should.equal(1) 2. res.render.getCall(0).args[1].restaurants[0].id.should.equal(2) 參考討論:https://lighthouse.alphacamp.co/courses/118/units/25601?comment_id=148475#question_subjects ``` getUser: (req, res) => { User.findByPk(req.params.id) .then(user => { // Article is a sequelize Model object Article.findAll(user.id) .then(articles => { res.render('profile', { user: user.toJSON(), articles }) }) }) } ``` ## 4. by 小鹿 在實作判斷email是否重複時(R02測試檔),發現測試檔不管怎樣都會跑進去if判斷式內,所以如果在res.redirect('back')前加上return就會造成測試檔過不了,拿掉就可以通過,不是非常確定為什麼會這樣,因此想跟助教討論討論!(寫法如下) ``` if (helpers.getUser(req).email !== req.body.email) { const emailCheck = await User.findOne({ where: { email: req.body.email } }) if (emailCheck.id) { req.flash('error_messages', "此email已註冊過") return res.redirect('back') } } ``` ### Answer 這個邏輯沒有問題 問題出在 sequelize-mock 對於 Model.findOne 的模擬邏輯 在 sequelize-mock 中的 Mock.findOne 模擬方法,會在找不到資料時,依據你的搜尋條件為你自動產生一筆資料給你,因此在測試程式執行中,不管你怎麼搜尋,都會有資料 而 sequelize-mock 有針對這樣的模擬策略,提供參數讓我們調整  但因為 sequelize-mock 在找不到資料時,會 throw EmptyQueryQueueError 的 exception 因此若是要做這個優化功能,測試內容就得再修正 這裡需要再請測試開發團隊評估
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up