2017-02-23 54 views
0

我想要得到承諾的結果before摩卡 - 檢索承諾測試的結果

describe('unsubscribe', function() { 
     var arn; 
     this.timeout(10000); 
     before(function(done) { 
      sns.subscribe('param1', 'param2').then(
       (result) => { 
       arn = result; 
       done(); 
      }, 
      (error) => { 
       assert.fail(error); 
       done(); 
      }); 
     }); 
     it('("param") => promise returns object', function() { 
      const result = sns.unsubscribe(arn); 
      expect(result).to.eventually.be.an('object'); 
     }); 
    }); 

同樣,在after我想獲得承諾的結果,在測試

describe('subscribe', function() { 
     var arn; 
     this.timeout(10000); 
     it('("param1","param2") => promise returns string', function(done) { 
      sns.subscribe('param1', 'param2').then(
       (result) => { 
        arn = result; 
        expect(result).to.be.a('string'); 
       }, 
       (error) => { 
        assert.fail(error); 
        done(); 
       }); 
     }); 
     after(function(done) { 
      sns.unsubscribe(arn).then(
       (result) => done()); 
     }); 
    }); 

這段代碼寫得好嗎?有沒有更好的做法?推薦的方式是什麼?

回答

1

每一個你想讓摩卡等待承諾解決的地方,你應該回復承諾,而不是使用done。所以,你的before鉤可以簡化爲:

before(() => sns.subscribe('param1', 'param2') 
     .then((result) => arn = result)); 

這比在這裏和那裏有done和不必做什麼特別的錯誤條件更具有可讀性。如果出現錯誤,諾言將拒絕,摩卡將抓住它並報告錯誤。沒有必要執行你自己的斷言。

你有一個測試和一個after掛鉤,也可以通過返回他們使用的承諾而不是使用done來簡化。如果你測試取決於承諾,請記住返回。你忘了在你的一個測試:

it('("param") => promise returns object', function() { 
    const result = sns.unsubscribe(arn); 
    // You need the return on this next line: 
    return expect(result).to.eventually.be.an('object'); 
}); 

提示:如果你有一個測試套件中的所有測試都是異步的,你可以使用--async-only選項。這將使摩卡要求所有的測試呼籲done或返回一個承諾,並可以幫助你忘記返回承諾的情況。 (否則,這樣的情況是很難,如果他們沒有提出任何錯誤。)

定義回調一個變量describe並在before/beforeEach掛鉤的一個設置,並在after/afterEach鉤檢查它的標準方式在鉤子和測試之間傳遞數據。摩卡沒有提供特別的設施。所以,是的,如果您需要傳遞承諾結果的數據,您需要像執行.then一樣執行任務。您可能會遇到一些示例,其中使用describe回調中定義的變量而不是使用變量的人員將在this上設置字段。噢,這可行,但海事組織是脆弱的。一個非常簡單的例子:如果你設置this.timeout來記錄一些只對你的測試有意義的數字,那麼你已經覆蓋了Mocha提供的用於改變其超時的功能。你可以使用另一個不衝突的名字,但會在新版本的Mocha發佈時發生衝突。

+0

謝謝你的回答。還有一個問題:如果測試承諾的返回結果有許多「期望」,那麼怎麼樣?什麼時候會被退回? – necroface

+1

'chai-as-promised'的斷言是承諾,所以你可以使用'then'將它們鏈接成任何承諾。你可能會返回expect(result).to.eventually.be.an(「object」)。then(()=> expect(otherResult).to.eventually.be.whatever)' – Louis

相關問題