---
# System prepended metadata

title: Debugging Q&A
tags: [學期 3]

---

###### 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

![](https://i.imgur.com/Cn9P0Ok.png)

### Answer 
這裡與測試程式有關

從 req.user 得到的資料內容由這段程式定義
R05.test.js
![](https://i.imgur.com/EXvlFxK.png)
在程式中取得的結果為
```javascript=
{ FavoritedRestaurants: [] }
```


但若是從 helpers.getUser(req) 得到的資料內容則由這段程式定義
R05.test.js
![](https://i.imgur.com/F6bsDKT.png)

這段模擬了 helpers.getUser 的 return 結果，在測試程式執行的情況下，並不會真正進入 helpers.getUser 方法執行，而是直接依據設置的 returns 返回
```javascript=
{ id: 1, Followings: [], FavoritedRestaurants: [] }
```

依照這樣的邏輯，使用 helpers.getUser(req) 在這裡才是正確的做法，但是測試卻無法通過
原因在於 unitTestHelper.js 模擬 Model.destroy 的邏輯
![](https://i.imgur.com/BeLYZ8Z.png)
46 行的目的是想從餐廳關聯的 FavoritedUsers 中移除該使用者ID，從而在之後查詢時，該餐廳的追蹤數就會減少
這裡注意白底 UserId 的大小寫

再看 R05.test.js 塞入的模擬資料
![](https://i.imgur.com/YAqGv0w.png)

由於大小寫差異，導致原本應該移除 userId 為 1 的資料沒有被移除
誤打誤撞，使用 req.user.id 取得的值為 undefined，反而成功移除這筆資料

除錯的過程可以作為參考，了解為什麼發生這個錯誤即可
再請測試開發團隊修正




## 2. by CH Lin 

npm run test 前面有出現正常測試結果，但最後出現下圖訊息，想問助教這些內容是什麼意思

![](https://i.imgur.com/whI9gpe.png)



## 3. by 高明
本地運行都沒問題，但測試檔就有錯誤，請問要如何解讀這段錯誤訊息
![](https://i.imgur.com/n7c0sBW.png)
對應的程式碼是
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 有針對這樣的模擬策略，提供參數讓我們調整
![](https://i.imgur.com/oLCaR5K.png)
但因為 sequelize-mock 在找不到資料時，會 throw EmptyQueryQueueError 的 exception

因此若是要做這個優化功能，測試內容就得再修正
這裡需要再請測試開發團隊評估
