覆盖let in it方法来改变params发送给subject

时间:2017-10-08 02:00:19

标签: ruby rspec

可以覆盖规范中的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{}吗?

1 个答案:

答案 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 ...调用可能更具可读性和可维护性