用户让参数

时间:2018-03-13 09:05:21

标签: rspec

我想测试这个课程:

class Response

  def initialize(raw_response:)
     ........
  end
end

我想在rspec中发送多个raw_responses。我实现了这段代码:

  let(:successful_response)    { File.read(File.join('spec', 'fixtures', 'xml', 'successful_response.xml')) }
  ......
  let(:response)               { described_class.new(raw_response: file_name) }

  context '#response' do

    it 'submits response' do 

      let(:file_name) { :successful_response }              
      expect(:response(raw_response: :file_name).parse_response).to include(................)
    end
  end

但是当我运行代码时,我收到了这个错误:

syntax error, unexpected '(', expecting ')'
expect(:response(raw_response: :file_name).par...
                         ^

我如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您就是这样做的:

context 'when response is successful' do
  let(:file_name) { successful_response } 
  it 'submits response' do              
    expect(response.parse_response).to include(...)
  end
end

context 'when response is unsuccessful' do
  let(:file_name) { 'bad.xml' } 
  it 'submits response' do              
    expect(response.parse_response).to include(...)
  end
end

不要在let内使用it/specify - 它不起作用。如果您需要更改其他上下文的值,请使用context

你可以考虑let来定义一个memoized方法。

let(:response) { described_class.new(raw_response: filename) }
let(:filename) { :foo }

就像

def response 
  described_class.new(raw_response: filename)
end

def filename
  :foo
end

答案 1 :(得分:1)

上面的答案一下子解决了几个格式问题,但只是想指出OP得到的具体错误:

  

syntax error, unexpected '(', expecting ')' expect(:response(raw_response: :file_name).par...

是因为:responseSymbol,而不是你可以传递参数的东西,所以(是意料之外的。

如果你确实想要测试关于Symbol的某些东西它可以工作,但是仍然需要注意的是,这只是测试符号本身,而不是let变量。 expect(:request).to be_a(Symbol)

没有response

:是如何访问由let创建的变量: expect(response.parse_response).to include(...)