代码之家  ›  专栏  ›  技术社区  ›  Peter Penzov

带参数的用户let

  •  2
  • Peter Penzov  · 技术社区  · 7 年前

    我想测试这个类:

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

    我想在rspec中发送多个raw\U响应。我实现了以下代码:

      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 回复  |  直到 7 年前
        1
  •  5
  •   Greg    6 年前

    以下是您的操作方式:

    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(:response) { described_class.new(raw_response: filename) }
    let(:filename) { :foo }
    

    就像

    def response 
      described_class.new(raw_response: filename)
    end
    
    def filename
      :foo
    end
    
        2
  •  1
  •   Jordan Arnesen    7 年前

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

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

    是因为 :response 是一个 Symbol ,而不是可以传递参数的对象,因此 ( 是意外的。

    如果你真的想测试一下 象征 它可以工作,但需要注意的是,这只是测试符号本身,而不是 let 变量 expect(:request).to be_a(Symbol)

    response 没有 : 是如何访问 允许 : expect(response.parse_response).to include(...)