2015-12-16 71 views
0

試圖圍繞這一點我的頭,它把我的思想在異步循環。異步與RethinkDB和柴

運行這個簡單的測試後,手動檢查RethinkDB的結果是否正確(db'test'中名爲'books'的一個表);不過,無論我在chai的expect函數中聲明瞭什麼,該測試都會通過。我知道這是一個異步問題,因爲測試完成後console.log(result)會打印到控制檯。我認爲expect會在Rethink得到tableList()之後運行,因爲它在回調中。

  1. 這是爲什麼檢驗合格(應該失敗,其中['books'] === ['anything']
  2. 爲什麼不expect()運行後tableList()
  3. ,使它們按順序執行什麼是連鎖命令RethinkDB的正確方法?

db_spec.js:

import {expect} from 'chai' 
import r from 'rethinkdb' 

describe('rethinkdb',() => { 
    it('makes a connection',() => { 
    var connection = null; 
    r.connect({host: 'localhost', port: 28015}, function(err, conn) { 
     if (err) throw err 
     connection = conn 

     r.dbDrop('test').run(connection,() => { 
     r.dbCreate('test').run(connection,() => { 
      r.db('test').tableCreate('books').run(connection,() => { 
      r.db('test').tableList().run(connection, (err, result) => { 
       if (err) throw err 
       console.log(result) 
       expect(result).to.equal(['anything']) 
      }) 
      }) 
     }) 
     }) 
    }) 
    }) 
}) 
+0

我相信你應該使用'expect(result).to.deep.equal(...)'。直接比較Javascript中的數組並不那麼簡單。 – Tryneus

+2

至於異步問題,你的測試用例沒有采用'done'回調,所以框架假設你的測試是同步的。爲了解決這個問題,測試用例聲明應該是'it('建立連接',(done)=> ...)',並且你應該在'expect'後面調用'done()'。 – Tryneus

+0

@Tryneus謝謝。查看修改後的代碼。還有一些問題。 – RichardForrester

回答

0

我認爲這可以工作,但最內部的回調不會被執行,測試只是超時。

import {expect} from 'chai' 
import r from 'rethinkdb' 

describe('rethinkdb',() => { 
    it('makes a connection', (done) => { 
    var connection = null; 
    r.connect({host: 'localhost', port: 28015}, function(err, conn) { 
     if (err) throw err 
     connection = conn 

     r.dbDrop('test').run(connection,() => { 
     r.dbCreate('test').run(connection,() => { 
      r.db('test').tableCreate('books').run(connection,() => { 
      r.db('test').tableList().run(connection, (err, result) => { 
       if (err) throw err 
       expect(result[0]).to.equal('books').done() 
      }) 
      }) 
     }) 
     }) 
    }) 
    }) 
})