Jest相当于RSpec惰性求值变量(let)?

时间:2017-05-23 17:16:03

标签: javascript testing ecmascript-6 jestjs

在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', () => {

    });
  });
});

3 个答案:

答案 0 :(得分:2)

使用beforeAll在父beforeEach中设置变量。

基于@Noah自己的答案,我想我也将与使用this分享我们的最终解决方案。

describe( "Logging in", () => { 
  beforeEach( () => login( this.password ) ); // Steps are same for all so re-use but use different password.

  describe( "when password is incorrect", () => {
    beforeAll( () => this.password = "INCORRECT PASSWORD" );

    it( "doesn't log in.", () => {
      // Your assertion(s).
    } );
  } );

  describe( "when password is correct", () => {
    beforeAll( () => this.password = "CORRECT PASSWORD" );

    it( "logs in successfully.", () => {
      // Your assertion(s).
    } );
  } );
} );

答案 1 :(得分:0)

我发现最好的解决方案是

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', () => {

    });
  });
});

答案 2 :(得分:0)

我最近创建了自己的库(与此处提到的其他库类似)以实现此确切目的,因为我觉得此处提到的其他两个库都有一些缺点。看看吧!

https://github.com/enova/givens

此参数与Rspec之间的唯一区别是,它实际上并未将变量放在范围内,而是让您在给定的函数上进行访问(这就是为什么我不想使用bdd-lazy-var)

与给定2相比,该库的优点在于,它完全支持在给定测试的beforeEach和afterEach调用之间进行缓存。如果必须与beforeEach块中的惰性声明的变量进行交互以进行一些设置,则该设置将保留用于实际测试,而afterEach块将保留在之后,以清除下一个测试。