我想测试这个课程:
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...
^
我如何解决这个问题?
答案 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...
是因为:response
是Symbol
,而不是你可以传递参数的东西,所以(
是意料之外的。
如果你确实想要测试关于Symbol
的某些东西它可以工作,但是仍然需要注意的是,这只是测试符号本身,而不是let
变量。
expect(:request).to be_a(Symbol)
response
的 :
是如何访问由let
创建的变量:
expect(response.parse_response).to include(...)