2014-09-25 33 views
0

我正在用摩卡書寫一個metalsmith插件及其相關測試套件。測試metalsmith插件,應該用摩卡拋出錯誤

如果缺少配置的插件應該拋出一個異常:

function plugin(config) { 
    ... 
    return function(files, metalsmith, done) { 
     ... 
     done(new Error("config error")); 
    } 
} 

,我嘗試用摩卡這種方式來測試它:

describe('my plugin', function() { 
it('should throw an exception', function(done) { 
    var metalsmith = Metalsmith('test/fixtures/basic'); 
    metalsmith 
     .use(myplugin({ 
      someconfig: { 

     })) 
     .build(function(err,files) { 
      assert(err); 
      done(); 
     }); 
    }); 
}); 

當我運行測試我有這樣的結果:

my plugin 
    ✓ should throw an exception 
    1) should throw an exception 


    1 passing (31ms) 
    1 failing 

    1) my plugin should throw an exception: 
    Error: done() called multiple times 

所以它似乎測試是好的,但以某種方式運行另一次,失敗這一次...

回答

2

的問題是,錯誤被扔foreach循環內部,造成做到()被調用多次:

Object.keys(files).forEach(function (file) { 
... 
done(new Error("config error")); 
... 
} 

添加一個簡單的返回不起作用,因爲你不能從一個foreach返回循環。

因此,使用一個簡單的for循環,而不是在foreach,返回的第一個錯誤:

for (var file in files) { 
... 
return done(new Error("config error")); 
... 
} 
+0

你考慮使用'嘗試... catch'? – user949300 2016-11-27 18:52:28