在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', () => {
});
});
});
答案 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块将保留在之后,以清除下一个测试。