Rspecでは、次のようなことができます。
let(:input) { 'foo' }
before_each do
setup_some_thing(input)
end
context 'when input is bar do
let(:input) { 'bar' }
it 'does something different' do
end
end
context 'when input is baz do
let(:input) { 'baz' }
it 'does something else different' do
end
end
これにより、大きなオブジェクトのメソッド呼び出しまたはインスタンス化を、その小さな部分の合計として定義できます。次に、異なるコンテキスト内でこれらの個々の小さなパーツをオーバーライドできます。各テストの前にハッピーパスを作成し、コンテキストブロック内でハッピーパスからの逸脱を指定するという考え方です。
残念ながら、私はJestでこれを行うことができないようです。私は以下を試しました:
beforeEach(() => {
let input = 'foo';
beforeEach(() => {
setupSomeThing(input);
});
describe('when input is bar', () => {
input = 'bar';
it('does something different', () => {
});
});
describe('when input is baz', () => {
input = 'baz';
it('does something different', () => {
});
});
});
Jestは特定の記述ブロックを実行する前にすべての記述ブロックを実行するため、入力は常に「baz」です。誰かが回避策、またはrspecの動作を取得する方法を知っていますか?
前もって感謝します!
BeforeAllを使用すると、同様の動作(遅延評価はありません)を取得できます。
beforeEach(() => {
let input = 'foo';
beforeEach(() => {
setupSomeThing(input);
});
describe('when input is bar', () => {
beforeAll(() => {
input = 'bar';
});
it('does something different', () => {
});
});
describe('when input is baz', () => {
beforeAll(() => {
input = 'baz';
});
it('does something different', () => {
});
});
});
私が見つけた最高の解決策は、
https://github.com/stalniy/bdd-lazy-var
そして
https://github.com/tatyshev/given2
依存関係を導入したくない場合は、次のようなことを行うと、同様の動作を得ることができます(遅延評価はありません)。
beforeEach(() => {
let input = 'foo';
beforeEach(() => {
setupSomeThing(input);
});
describe('when input is bar', () => {
beforeAll(() => {
input = 'bar';
});
it('does something different', () => {
});
});
describe('when input is baz', () => {
beforeAll(() => {
input = 'baz';
});
it('does something different', () => {
});
});
});
ここで述べた他のライブラリにはいくつかの欠点があると感じたので、この正確な目的を達成するために、ここで述べた他のライブラリと同様の独自のライブラリを最近作成しました。見てみな!
https://github.com/enova/givens
これとRspecの唯一の違いは、実際にはスコープに変数を配置せず、代わりに指定された関数でアクセスできるようにすることです(これがbdd-lazy-varを使用したくない理由です)。
Given2に対するこのライブラリの利点は、指定されたテストのbeforeEachおよびafterEach呼び出し全体でキャッシュを完全にサポートすることです。設定を行うためにbeforeEachブロックで遅延宣言された変数を操作する必要がある場合、その設定は実際のテストのために保持され、afterEachブロックは次のテストのためにクリアされる前に保持されます。