2012-12-11 51 views
0

以下是測試最好的方法嗎?或者我可以改進它(並刪除Step依賴)?摩卡:如何測試一系列異步操作,必須按順序測試

我特別擔心每個「步驟」函數會將前一次執行的測試與下一次執行的調用混爲一談。 (即剪切和粘貼易碎)

(另見:How can I execute async Mocha tests (NodeJS) in order?

it('should run an update', function(done) { 
    var db = new database.Database(); 
    var sess = new session.Session(db); 
    Step(
     function createTable() { 
     sess.exec('create table customers (id integer primary key auto_increment, name varchar, age integer)', this); 
     }, 
     function insertCustomer1(err, message) { 
     assert(!err, err); 
     assert.equal("Table created.", message); 
     sess.exec('insert into customers (name, age) values ("james", 41)', this); 
     }, 
     function insertCustomer2(err, message) { 
     assert(!err, err); 
     assert.equal("1 row inserted.", message); 
     sess.exec('insert into customers (name, age) values ("thomas", 19)', this); 
     }, 
     function updateCustomer1(err, message) { 
     assert(!err, err); 
     assert.equal("1 row inserted.", message); 
     sess.exec('update customers set age = 42 where name = "james"', this); 
     }, 
     function end(err, message) { 
     assert(!err, err); 
     assert.equal("1 row updated.", message); 
     done(); 
     } 

    ); 
    }); 

回答

1

爲了解決混爲一談的問題,你可以寫這樣的代碼:

Step(
    function createTable() { 
    var next = this; 
    sess.exec('create table customers (id integer primary key auto_increment, name varchar, age integer)', function (err, message) { 
     assert(!err, err); 
     assert.equal("Table created.", message); 

     next(); 
    }); 
    }, 
    function insertCustomer1() { 
    var next = this; 
    sess.exec('insert into customers (name, age) values ("james", 41)', function (err, message) { 
     assert(!err, err); 
     assert.equal("1 row inserted.", message); 

     next(); 
    }); 
    }, 

我相信你」需要設置var next = this,因爲Step使用this作爲異步步驟的回調,並且在調用sess.exec時它不會被正確綁定。如果這是一個打擊者(在我看來,樣板文字越少越好),您可以使用async#series來查看。