2016-02-01 82 views
2

我有以下貓鼬單元測試。 article.save()回調中的控制檯日誌行從數據庫中保存後,打印出歸屬於該實體的已分配_id。但是,無論何時我在該行或實際上在相應單元測試的第一行中放置斷點時,實體在文章集合中都不可用?貓鼬單元測試

任何人都可以解釋爲什麼這應該是?我正在努力理解這一點,並會感謝任何幫助!

謝謝, 馬克。

var app = require('../../server.js'), 
    should = require('should'), 
    mongoose = require('mongoose'), 
    User = mongoose.model('User'), 
    Article = mongoose.model('Article'); 

var user, article; 

describe('Article Model Unit Tests:', function() { 

beforeEach(function (done) { 

    user = new User({ 
     firstName: 'Full', 
     lastName: 'Last', 
     displayName: 'Full Name', 
     email: '[email protected]', 
     username: 'username', 
     password: 'password' 
    }); 

    user.save(function() { 
     article = new Article({ 
      title: 'Article Title', 
      content: 'Content Article', 
      user: user 
     }); 

     article.save(function (err, savedArticle) { 
      console.log(savedArticle._id); 
     }); 
    }); 

    done(); 
}); 

describe('Testing the save method', function() { 
    it('Should be able to save without problems', function() { 
     article.save(function (err) { 
      should.not.exist(err); 
     }); 
    }); 

    it('Should not be able to save without title', function() { 
     article.title = ''; 

     article.save(function (err) { 
      should.exist(err); 
     }); 
    }); 
}); 

afterEach(function(done) { 
    Article.remove(function(){ 
     User.remove(function(){ 
      done(); 
     }); 
    }); 
}); 
}); 

回答

1

我覺得做了應該調用裏面article.save的移動

因爲它是現在,做()幾乎總是被稱爲兩個保存完成之前,如果做的是移動則beforeeach只有當兩個保存完成時,塊纔會完成

+0

感謝百萬dm03514!我不知道爲什麼這有所作爲,但? done()方法完成什麼?它是否有效沖洗貓鼬模型?用戶永遠不會在單元測試中保存任何內容,但在應用程序中保存。 對不起,有很多問題,但我試圖開始與平均值,並有更多的問題比在這個階段的答案。 –

+0

如果我完全刪除done(),那麼文章在控制檯行的MongoDB中可用。 如果我將article.save()放在user.save()後放置done(),則文章不可用? 任何幫助在這裏將不勝感激。我來自Spring/Hibernate/Oracle的背景,所以我的假設可能會得到緩和。 –

+1

通常稱爲done的參數很奇怪,將它作爲beforeEach的一個參數添加,或者它將該操作標記爲async,如果您在其中添加了done並且未調用done,則測試用例會出錯。 Beforeeach可能會很奇怪,因爲如果它沒有拋出錯誤,它就會超時,然後去執行它,也許給人的印象是一切正常。 – dm03514