2013-02-23 160 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