2013-02-23 118 views
0

我想测试一个巨人+葡萄应用程序像下面+葡萄:测试巨人使用RSpec

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/上启动了一个巨作应用程序,该应用程序非常好用,但在制作更复杂的终端之前需要rspec。反正运行规范,我得到

未定义的局部变量或方法'应用”

这我无法摆脱的:

$ 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 

更新:

添加应用程序的方法,以投机/ 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)>' 

UPDATE

规格/ api_spec内从应用方法被称为加入API类。 rb:

def app 
    API 
end 

get undefined method 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)>' 

看到coll = env.mongo.collection('categories') API类中

回答

3

我终于可以使用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 

in spec/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 

巨人应用目录树,看起来像:

ls[email protected]:~/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 
[email protected]:~/rails/github/GGM$ 

其中配置和规格子目录的样子:

[email protected]:~/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 
[email protected]:~/rails/github/GGM$ 

主要巨人的应用程序是一样的我的第一篇文章:

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 

最简单的preatty。如果你想深入看看https://github.com/lgs/GGM

0

我认为你必须提供在您的测试方法来指定类的应用程式

def app 
    App 
end 

更新

尝试改为API类

def app 
    API 
end 
+0

不能正常工作,请参阅更新的主要问题: – 2013-02-23 15:42:38

+0

我不知道什么歌利亚。但似乎它应该工作,如果你使用API​​类而不是App – 2013-02-23 21:08:38

+0

现在我得到未定义的方法'mongo'请参见上次UPDATE – 2013-02-24 08:16:34

0

添加其他POST例如:

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