Sinatra spec测试未定义的局部变量或方法`response'

时间:2015-01-12 05:36:50

标签: rspec sinatra

在为我的sinatra项目配置rspec后,我运行:rspec ./myApp_spec.rb。但它并没有通过。规范日志如下:

  

- > rspec ./myApp_spec.rb

F

Failures:

  1) Main API should respond to GET
     Failure/Error: expect(response.status).to eq 200
     NameError:
       undefined local variable or method `response' for #<RSpec::ExampleGroups::MainAPI:0x007f94d23cf938>
 # ./myApp_spec.rb:6:in `block (2 levels) in <top (required)>'

Finished in 0.01261 seconds (files took 0.43698 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./myApp_spec.rb:4 # Main API should respond to GET

这是我的spec_helper文件:

spec_helper.rb

require File.join(File.dirname(__FILE__), '..', 'myApp.rb')
require 'sinatra'
require 'rack/test'
set :environment, :test
set :run, false
set :raise_errors, true
set :logging, false

def app
  Sinatra::Application
end

RSpec.configure do |config|
  config.include Rack::Test::Methods
end

这是我的规范测试文件:myApp_spec.rb

require './spec_helper'

describe "Main API" do
  it "should respond to GET" do
    get '/'
    expect(response.status).to eq 200
  end
end

这是我的代码:https://gist.github.com/williamhqs/c127e5d7018aa61cb02a

修改

我在myApp_spec文件中将response.status更改为last_response.status,这似乎有效。但我得到的日志如下,404未找到。

  1. responselast_response,它们之间的区别或位置是什么,响应是在rails_spec中?不确定。
  2. 有线的事情是当我访问http:// localhost:3001 /时,它会显示正确的&#39; Hello world&#34;内容。为什么是404?
  3. 抱歉,这是我在ruby / rails / sinatra中的第一次测试。

      

    故障:

         

    1)主API应响应GET        失败/错误:期望(last_response.status).to eq(200)

       expected: 200
            got: 404
    
       (compared using ==)
     # ./spec/myApp_spec.rb:8:in `block (2 levels) in <top (required)>'
    
         

    完成0.01601秒(文件加载0.43771秒)1   例如,1次失败

         

    失败的例子:

         

    rspec ./spec/myApp_spec.rb:5#Main API应该响应GET

    SLOUTION  1. sinatra只使用last_response,作为文档示例:http://www.sinatrarb.com/testing.html  2.更改应用方法

     def app   
       @app=MyApp
       #Sinatra::Application
     end
    

    希望帮助某人。

1 个答案:

答案 0 :(得分:1)

我看到你已经回答了你自己的问题,但是在这里做到这一点很好(我可以添加一些东西)

http://www.rubydoc.info/gems/rack-test/0.6.3开始,使用last_response

before do
  # this is not part of the spec
  # but a side effect that leads to the
  # thing to be specced, so it goes in `before`
  get page
end
subject {
  last_response.body
}
it { should be_ok }

您可以将其包含在共享上下文中,并将page作为本地var或let传递。

我讨厌expect语法,所以你可以自己解决这个问题!