私は事実上同じテストをたくさんしています。 DRYとスキャン可能性のために、テストを単一の関数に抽象化してから、その関数をいくつかのパラメータで呼び出すことができます。関数はit
を呼び出して、仕様をスイートに追加します。関数内でジャスミン仕様を定義しても、beforeEachを適用することは可能ですか?
仕様が他の仕様と同じ方法で実行されず、共通機能で定義された仕様の前にbeforeEach
が呼び出されていないことを除いて、動作するようです。
define(['modules/MyModule','jasmine/jasmine'], function(MyModule) {
describe('myModule', function() {
function commonTests(params) {
it('should pass this test OK', function() {
expect(true).toBe(true);
});
it('should fail because module is undefined', function() {
expect(module[params.method]()).toBe('whatever');
});
}
var module;
beforeEach(function() {
module = new MyModule();
});
describe('#function1', function() {
commonTests({
method: 'function1'
});
});
describe('#function2', function() {
commonTests({
method: 'function2'
});
});
});
});
これを行うとbeforeEach
とafterEach
の機能を維持する方法はありますか?
UPDATE:私は私の例が間違って得たよう
が見える、申し訳ありません。
define(['modules/MyModule'], function(MyModule) {
function commonTests(params) {
it('will fail because params.module is undefined', function() {
expect(typeof params.module).toBe('object');
expect(typeof params.module[params.method]).toBe('function');
});
it('has a few tests in here', function() {
expect(true).toBe(true);
});
}
describe('MyModule', function() {
var module;
beforeEach(function() {
module = new MyModule();
});
describe('#function1', function() {
commonTests({
module: module,
method: 'function1'
});
});
describe('#function2', function() {
commonTests({
module: module,
method: 'function2'
});
});
});
});
私はmodule
の値は常に最初の例のようにmodule
の現在の値を使用するのではなく、commonTests
への呼び出しの一部として保存されるので、それは失敗だと思う:ここで失敗した場合です。
興味深いことに、もちろんあなたはもちろんそうです:それはrequire.jsです。私の知っていることは、MyModuleは 'commonTests'(これは省略していません)にはない、それを使っている他のテストがあるので、ロードされているということです。 'commonTests'でデバッガを実行し、' module'の値をチェックすると 'undefined'となります。それは 'commonTests'の外のテストで正しい値を持っています... ありがとう! –
他のテストは、2つの 'describe'コールの一番下に位置していると思いますよね?私はJSの 'var'スコープについて何かを読んだことを覚えています。場合によっては、関数内で 'var'で定義された変数は、' var'ステートメントの後でしか利用できません。ここに当てはまる場合は、 'commonTests'にあるグローバルな' module'(存在しない)にアクセスしようとします。おそらく、 'varモジュール 'と' beforeEach'を周囲の 'describe'の先頭に移動しようとすることができます。 – Andreas
ありがとうAndreas、私は見て、私のコードに例を比較し、それはわずかに異なっていた。私は質問に更新を投稿しました... –