首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Rspec测试Goliath +葡萄

用Rspec测试Goliath +葡萄
EN

Stack Overflow用户
提问于 2013-02-23 14:50:21
回答 3查看 2.8K关注 0票数 0

我正在尝试测试Goliath +葡萄应用程序,如下所示:

代码语言:javascript
复制
require 'em-synchrony/em-mongo'
require 'yajl/json_gem'
require 'goliath'
require 'grape'

class API < Grape::API
  version 'v1', :using => :path
  format :json

  resource 'categories' do
    # http://0.0.0.0:9000/v1/categories/
    get "/" do
      coll = env.mongo.collection('categories') #Connection Pool from Goliath ENV
      coll.find({})
    end
  end
end

class App < Goliath::API
  def response(env)
    API.call(env)
  end
end

这两个类位于一个名为app.rb的文件中。运行ruby ./app.rb -svhttp://0.0.0.0:9000/v1/categories/上启动一个goliath应用程序,这个应用程序工作得很好,但在创建更复杂的端点之前需要rspec。无论如何,运行我得到的规范

未定义的局部变量或方法“`app”

我无法摆脱的:

代码语言:javascript
复制
$ bundle exec rspec spec/api_spec.rb
FFFF

Failures:

  1) App App GET /v1/categories get several categories of repositories by name
     Failure/Error: get "/v1/categories"
     NameError:
       undefined local variable or method `app' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1::Nested_1:0x993eec4>
     # ./spec/api_spec.rb:9:in `block (4 levels) in <top (required)>'

api_spec看起来如下所示:

代码语言:javascript
复制
require 'spec_helper'

describe App do
  include Rack::Test::Methods

  describe App do
    describe 'GET /v1/categories' do
      it 'get several categories of repositories by name' do
        get "/v1/categories"
        last_response.status.should == 200
        JSON.parse(last_response.body)["name"].should == "Ruby Web Frameworks"
      end
    end
  end
end

最新情况:

向spec/api_spec.rb添加app方法:

代码语言:javascript
复制
def app
    App
end

引起另一种错误:

代码语言:javascript
复制
  1) App App GET /v1/categories get several categories of repositories by name
     Failure/Error: get "/v1/categories"
     NoMethodError:
       undefined method `call' for App:Class
     # ./spec/api_spec.rb:13:in `block (4 levels) in <top (required)>'

更新

在spec/ API _spec.rb中添加从app方法调用的api类:

代码语言:javascript
复制
def app
  API
end

获取undefined methodmongo'`:

代码语言:javascript
复制
Failures:

  1) App App GET /v1/categories get several categories of repositories by name
     Failure/Error: get "/v1/categories"
     NoMethodError:
       undefined method `mongo' for #<Hash:0xad5ea58>
     # ./app.rb:14:in `block (2 levels) in <class:API>'
     # ./spec/api_spec.rb:13:in `block (4 levels) in <top (required)>'

参见API类中的coll = env.mongo.collection('categories')

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-25 22:36:51

我终于能够让它使用辅助对象。这是为了追踪的目的,希望它能帮助其他人。

在spec/spec_helper.rb中,添加goliath测试助手和所有依赖项。就我而言:

代码语言:javascript
复制
require 'em-synchrony/em-http'
require 'goliath/test_helper'
require 'yajl/json_gem'

Goliath.env = :test

RSpec.configure do |c|
  c.include Goliath::TestHelper, :example_group => {
    :file_path => /spec\//
  }
end

在spec/app_spec.rb中

代码语言:javascript
复制
require 'spec_helper'
require File.join(File.dirname(__FILE__), '../', 'app')

describe App do
  def config_file
    File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'app.rb'))
  end

  let(:api_options) { { :config => config_file } }

  it 'renders ' do
    with_api(App, api_options) do
      get_request(:path => '/v1/categories') do |c|
        resp = JSON.parse(c.response)
        categories = resp.map{|r|r['name']}
        categories.to_s.should =~ /Ruby Web Frameworks/
      end
    end
  end
end

Goliath应用程序dir树,如下所示:

代码语言:javascript
复制
lsoave@ubuntu:~/rails/github/GGM$ ls -l 
total 48
-rw-rw-r-- 1 lsoave lsoave  483 Feb 25 23:06 app.rb
-rw-rw-r-- 1 lsoave lsoave 6321 Feb 25 23:06 categories.json
drwxrwxr-x 2 lsoave lsoave 4096 Feb 25 23:06 config
-rw-rw-r-- 1 lsoave lsoave  381 Feb 25 23:06 Gemfile
-rw-rw-r-- 1 lsoave lsoave 2293 Feb 25 23:06 Gemfile.lock
-rw-rw-r-- 1 lsoave lsoave   59 Feb 21 20:37 Procfile
-rw-rw-r-- 1 lsoave lsoave  123 Feb 25 23:06 Rakefile
-rw-rw-r-- 1 lsoave lsoave 7003 Feb 21 20:37 README.md
-rw-rw-r-- 1 lsoave lsoave  238 Feb 25 23:06 README.mongoimport
drwxrwxr-x 2 lsoave lsoave 4096 Feb 25 23:23 spec
lsoave@ubuntu:~/rails/github/GGM$ 

其中的config和spec子目录如下所示:

代码语言:javascript
复制
lsoave@ubuntu:~/rails/github/GGM$ ls -l config spec
config:
total 4
-rw-rw-r-- 1 lsoave lsoave 870 Feb 25 23:06 app.rb

spec:
total 11
-rw-rw-r-- 1 lsoave lsoave  777 Feb 25 23:06 app_spec.rb
-rw-rw-r-- 1 lsoave lsoave  218 Feb 25 23:06 spec_helper.rb
lsoave@ubuntu:~/rails/github/GGM$ 

主要的goliath应用程序与我的第一篇文章相同:

代码语言:javascript
复制
require 'em-synchrony/em-mongo'
require 'yajl/json_gem'
require 'goliath'
require 'grape'

class API < Grape::API
  version 'v1', :using => :path
  format :json

  resource 'categories' do
    # http://0.0.0.0:9000/v1/categories/
    get "/" do
      coll = env.mongo.collection('categories') #Connection Pool from Goliath ENV
      coll.find({})
    end
  end
end

class App < Goliath::API
  def response(env)
    API.call(env)
  end
end

早产简单到最后。如果您想深入了解,请看一看https://github.com/lgs/GGM

票数 3
EN

Stack Overflow用户

发布于 2013-02-23 15:11:24

我认为您必须在测试中提供一个方法来指定应用程序的类。

代码语言:javascript
复制
def app
  App
end

更新

尝试使用API类代替

代码语言:javascript
复制
def app
  API 
end
票数 0
EN

Stack Overflow用户

发布于 2014-03-16 07:59:08

添加其他帖子示例:

代码语言:javascript
复制
require 'spec_helper'

describe V1::API do
  it "login" do
    with_api V1::Login do


      post_request(path: "/v1/login", :head => {'authorization' => HTTP_BASIC_HEADER }, :body =>{mobile: 18600112233}) do |async|

        async.response_header.status.should == 201
        async.response.should == { mobile: '18600112233' }.to_json
      end
    end
  end

end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15041777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档