2017-03-13 204 views
0

這是update功能我想在嘲笑數據庫異步等待單元測試問題

import Book from '../model/book'; 

function bookRepository(db) { 
    this.db = db; 
}; 

bookRepository.prototype.update = async function(id, data) { 
    return await Book.findOneAndUpdate({ _id: id }, { $set: data }); 
} 

export default bookRepository; 

,以測試這是測試腳本我寫了這

import chai from 'chai'; 
import chaiAsPromised from 'chai-as-promised'; 
chai.use(chaiAsPromised); 
const expect = chai.expect; 

import app from '../../server'; 
import bookRepo from '../../repository/book'; 
const Book = new bookRepo(app.db); 

describe('Test repository: book',() => { 

    describe('update',() => { 
     let id; 
     beforeEach(async() => { 
      let book = { 
       name: 'Records of the Three Kingdoms', 
       type: 'novel', 
       description: 'History of the late Eastern Han dynasty (c. 184–220 AD) and the Three Kingdoms period (220–280 AD)', 
       author: 'Luo Guanzhong', 
       language: 'Chinese' 
      }; 
      let result = await Book.insert(book); 
      id = await result.id; 
      return; 
     }); 
     it('Update successfully', async() => { 
      let data = { 
       type: 'history', 
       author: 'Chen Shou' 
      }; 
      let result = await Book.update(id, data); 
      await expect(result).to.be.an('object'); 
      await expect(result.type).to.be.equal('history'); 
      return expect(result.author).to.be.equal('Chen Shou'); 
     }); 
    }); 

}); 

我收到此錯誤

AssertionError: expected 'novel' to equal 'history' 
     + expected - actual 

當我檢查模擬數據庫時,它會更新數據,但爲什麼它的斷言失敗?它應該在完成後更新await致電

+0

'console.log(result)'給你什麼? – lonesomeday

+0

@lonesomeday和'book'完全一樣,好像它還沒有得到更新 – necroface

回答

2

findOneAndUpdate方法需要options作爲第三個參數。其中一個選項是returnNewDocument: <boolean>。這是默認的false。如果您沒有將此選項設置爲true,那麼MongoDB會更新文檔並因此返回舊文檔。如果您將此選項設置爲true,那麼MongoDB將返回新的更新文檔。

從官方文檔 -

返回要麼是原始文件,或者,如果returnNewDocument:真正的,更新的文檔。

所以在你更新的方法,做如下改變 -

return await Book.findOneAndUpdate({ _id: id }, { $set: data }, { returnNewDocument : true }); 

你可以閱讀一下here

編輯 - 如果使用mongoose然後使用{new: true}選項,而不是上面的選項作爲mongoose的使用findAndModifyfindOneAndUpdate方法下方。

+0

非常感謝。只需在你的答案中稍加修改,正確的選項是:''{{new:true}''' – necroface

+0

@necroface我想你正在使用'mongoose'。我提供的文檔是針對本地MongoDB驅動程序的:)我會在答案中提到這一點。 –