2017-02-23 2 views
0

私は、テストを実行する前に、最初のセットアップにいくつかの変数を好き と私は、Running Mocha setup before each suite rather than before each test各テストの前にモカスイートの変数を設定しますか?

を、この解決策を見つけた。しかし、私は私が私のコールバックの中に変数を渡すことができる方法を知っている私は私が得るだろうでしたが、彼らの方法いけないでしょう未定義

makeSuite('hello', (context) => { 
    it('should return',() => { 
     assert.strictEqual(1, 1) 
    }) 
}) 
makeSuite('world', (context) => { 
    it('should return',() => { 
     console.log(context) // undefined 
     assert.strictEqual(1, 1) 
    }) 
}) 

function makeSuite(name: string, cb: (context: any) => any) { 
    let age: string; 
    describe(name,() => { 
     beforeEach(() => { 
      age = '123' 
     }) 

     cb(age); 
    }) 
} 

私はbeforeEachフックでセットアップする必要があり、多くのプライベート変数を持つことになります、と私はすべてのテストのために私のコードを繰り返したいいけない、ので、コールバックの中に変数を渡したい理由。 describeに渡さ

答えて

2

コールバックはすぐに呼ばれていますが、テストが実行されたとき、あなたのbeforeEachフックは後でと呼ばれています。したがって、cb(age)が呼び出された場合、ageの値はundefinedです。 ageは、後で"123"に設定されますが、cbは既に値のコピーを取得しているため、効果はありません。 cbに変更が反映されるためには、変更したオブジェクトへの参照を渡す必要があります。

makeSuite('world', (context) => { 
    it('should return',() => { 
     console.log(context.age) 
    }) 
}) 

function makeSuite(name, cb) { 
    describe(name,() => { 
     let context = { 
      age: undefined, 
     }; 
     beforeEach(() => { 
      context.age = '123'; 
     }); 

     cb(context); 
    }); 
} 

(それは純粋なJavaScriptを実行されるように、私は活字体の型注釈を削除した注釈は、とにかく問題を解決するために重要ではありません。。)

+0

非常にスマートなソリューション! ;)、私は別の方法を見つけました、 'モカコンテキスト'に注入することですが、これは良い習慣だとは思わない! – Tim

0

別の方法があり、これはこのような何かmocha context

makeSuite('world', function() { 
    it('should return', function() { 
     // read the variable as shown below 
     console.log((this as any).age); // 123 
    }) 
}) 

function makeSuite(name: string, cb:() => any) { 
    describe(name, function() { 
     beforeEach(function() { 
      // inject the desired variable into the mocha context 
      (this as any).age = 123; 
     }) 

     cb(); 
    }) 
} 

に変数を注入することである。しかし、私はモカコンテキストに変数を注入するのは良い習慣です、@Louisが提供する答えはよりよい解決策

だろうと思ういけません
+1

ええ、私はMochaによって提供され、その公開APIの一部といくつかのプライベートな価値が含まれているので、私は「this」をつぶすファンではありません。 'this'に何かを追加することは何度も働いていますが、ある日、新しい変数のMochaがあなたが選んだ変数と衝突する可能性があります。たとえば、 'this.timeout'や' this.retries'を設定すると、Mocha自身の関数が上書きされます。 – Louis

+0

は完全に同意します!あなたの素敵なハックありがとう! ;) – Tim

関連する問題