2016-07-17 58 views
1

我想測試一個JSON API端點,並且由於user.find的調用失敗,我得到一個ActiveRecord::RecordNotFound異常。如何使用RSpec模擬數據庫調用

我該如何模擬我的測試的活動記錄調用,以便返回一些內容並且不會引發異常?

(我用factory_girl此外,如果我可以使用)

def do_something 
    success = false 
    message = "" 

    user = User.find(params[:user_id]) 

    if user.present? 
    # ... 

    if user.save! 
     success = true 
    end 
    end 

    render json: { 
    "success": success, 
    "message": message 
    } 
end 

我的RSpec的樣子:

#RSpec.describe Api::UsersController, type: :controller do 

it "should return some JSON" do 
    payload = { 
    user_id: "1", 
    # ... 
    }.to_json 

    post :do_something, payload, format: :json 

    expected = { 
    success: false, 
    message: "" 
    }.to_json 

    expect(response.body).to eq(expected) 
end 

回答

0

那麼如果你想嘲笑數據庫ActiveRecord的,你可以嘗試這樣的事情。

let(:user) { build_mock_class.new() } 
before(:all) { create_table } 
after(:all) { drop_table } 

    def build_mock_class 
    Class.new(ActiveRecord::Base) do 
     self.table_name = 'mock_table' 
    end 
    end 

    def create_table 
    ActiveRecord::Base.connection.create_table :mock_table do |t| 
     t.integer :user_id 
     t.timestamps 
    end 
    end 

    def drop_table 
    ActiveRecord::Base.connection.drop_table :mock_table 
    end 

但是你必須在繼續之前建立的連接,你可以把你的連接適配器spec_helper

ActiveRecord::Base.establish_connection(
    adapter: 'sqlite3', 
    database: ':memory:' 
) 

你可以用任何你想要的列名,也這將創建表時規範運行並在規範通過後破壞。

注:不要忘記需要你的spec_helperactive_recordsqlite3或任何你想要使用。

希望它有幫助。

+0

你是什麼意思,我不實際使用AR? – Blankman

+0

哦,對不起,我忘了你正在寫軌道應用程序的規格。其實我需要在開發一個'ruby gem'的同時嘲笑db。對不起,我會更新我的答案。 – Sinscary

1

我認爲你需要使用FactoryGirl先創建一個用戶,那麼您可以在有效載荷傳遞用戶的ID,像這樣:

let(:user) { create :user } # create user by FactoryGirl 

it "should return some JSON" do 
    payload = { 
    user_id: user.id, 
    # ... 
    }.to_json 
    ... 
end