【问题标题】:Async Testing with Vows and Mongoose使用 Vows 和 Mongoose 进行异步测试
【发布时间】:2011-11-03 16:27:41
【问题描述】:

使用 Vows/Coffeescript/Mongoose 并遇到 DB 的异步问题。

在我的测试运行之前,我做了很多设置,包括清除测试数据库。一旦我在最后一个文档上调用了 remove,我就会触发回调,以便 Vows 可以继续测试的下一步。问题在于,由于事情是异步发生的,因此无法保证数据库实际上已被清除。在这种情况下,我实际上想要同步,但我不知道如何做到这一点。

这是代码(Vows sn-p 然后是清除函数 def):

'AND the test database is empty': 
  topic: ->
    testDB.purge "widgets_test", @callback

purge = (database, callback) ->
db = mongoose.connect "mongodb://localhost/#{database}"
modelCount = Models.length
for model in Models
    modelCount--
    model.find {}, (err, docs) ->
        docCount = docs.length
        for doc in docs
            doc.remove (err) ->
            docCount--
    # do callback after all data has been purged - setTimeout HACKHACKHACK
        if modelCount is 0 and docCount is 0
            setTimeout -> 
                callback()
            , 100

这样做的正确方法是什么?

【问题讨论】:

    标签: node.js coffeescript mongoose


    【解决方案1】:

    我使用的技巧是在后续批次中运行测试之前,在单独的批次中执行此设置/拆卸。

    这似乎对我有用(我也在使用 vows 和 Mongo)

    【讨论】:

    • 是的,确定事情按顺序运行并不是一个糟糕的解决方案。但是在上面的示例中,如果没有 hack setTimeout,您可能在清除数据库之前就已经开始进行测试了。猜猜你可以在确保删除最后一个模型的最后一个文档之后,将事情重新设计为触发回调()作为 doc.remove 回调的一部分。但还是有点丑。
    • 您需要触发回调以确保批处理已执行并结束。这很丑陋,但有一些异步工作的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2011-10-18
    • 2021-04-12
    • 1970-01-01
    • 2013-06-28
    • 2016-04-05
    相关资源
    最近更新 更多