2011-12-25 14 views
1

非同期関数と誓約をテストする(潜在的な)インターリーブ方法はありますか?例えば誓約:非同期インターリーブのテスト

// Topic portion 
var user = new User('jacob') 
user.set('email,'[email protected]') 
user.save() // a 
user.set('email',[email protected]') 
user.save() // b 
user.refresh(this.callback) // Reload from database 

// Callback 
assert.equals(user.email,'[email protected]') 

2セーブ間の競合状態可能性があります。私のテストを書くとき、私はAPIが最後にbが終わることを保証したいと思っています。それが書かれている方法で、テストは同時に偶然に渡されます。

+0

'保存()'関数のコールバックはありますか? – fent

答えて

1

誓いのドキュメントからの相続人例:

ネストされたコンテキストは、ネストされたコールバックとして機能し、次のコンテキストに戻り引数を渡します。

ドキュメント:http://vowsjs.org/

{ topic: function() { 
    fs.stat('~/FILE', this.callback); 
    }, 
    'after a successful `fs.stat`': { 
    topic: function (stat) { 
     fs.open('~/FILE', "r", stat.mode, this.callback); 
    }, 
    'after a successful `fs.open`': { 
     topic: function (fd, stat) { 
     fs.read(fd, stat.size, 0, "utf8", this.callback); 
     }, 
     'we can `fs.read` to get the file contents': function (data) { 
     assert.isString (data); 
     } 
    } 
    } 
} 
+0

これは実際に私が望むものの反対です。実際に、テストコードを明示的に強制的に強制的に強制的に強制的に強制的に強制的に書かなくても、私の競合状態が起こらないことをテストしたいと思います。目標は透明にすることです。しかし、おそらくこれはとにかくノードの穀粒に逆らっています。要点は、私はシーンの後ろにセーブ()を待ちたい。 – Koobz

+0

これにより競合状態が解消されます。シーケンスの望ましくないタイミングは、コールバックの使用によって排除されます。 潜在的に非連続的に実行される並列コードを投稿することができました。 –

+0

クライアント側のコードで競合状態を修正するようにサーバーを強制したいと思うように思えますが、これはクライアントとサーバーの間の待ち時間の性質上不可能です。これは正しいです? –