gpt4 book ai didi

ruby - 使用 Rspec 测试 Goliath + Grape

转载 作者:行者123 更新时间:2023-11-28 21:05:36 24 4
gpt4 key购买 nike

我正在尝试像下面这样测试 Goliath + Grape 应用程序:

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在制作更复杂的端点之前。无论如何运行我得到的规范

undefined local variable or method `app'

我无法摆脱:

$ 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 如下所示:

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 :

def app
App
end

引发另一种错误:

  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 类:

def app
API
end

获取 未定义的方法mongo'` :

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')

最佳答案

我终于能够使用 goliath test_helper 让它工作了.这是为了跟踪目的,希望它可以帮助别人。

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

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

在规范/app_spec.rb 中

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 应用目录树,看起来像:

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 子目录看起来像:

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 应用程序与我的第一篇文章相同:

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 .

关于ruby - 使用 Rspec 测试 Goliath + Grape,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15041777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com