可以覆盖规范中的let
值吗?我希望能够在每个测试中设置主题并修改我的参数,例如:
subject {
MyClass.new params
}
let(:params) { {} }
describe '#initialize' do
it 'should set new params' do
params = {a: 1}
expect{ subject }.to do_something
end
it 'should raise with string' do
params = 'string'
expect{ subject }.to raise_error
end
end
或者解决这个问题的正确方法是什么?我应该用全班名写expect{}
吗?
答案 0 :(得分:1)
我会改写这样的规格:
subject { -> { MyClass.new(params) } } # Note: subject is a lambda
describe '#initialize' do
context 'with blank params' do
let(:params) { {} }
it { is_expected.to do_something }
end
context 'with string params' do
let(:params) { 'string' }
it { is_expected.to raise_error }
end
end
但是 - 正如最大的辩护者已经说过的那样 - 在这个简单的例子中,跳过subject
并且只是在期望中直接使用MyClass.new ...
调用可能更具可读性和可维护性