如何为API编写Rspec

时间:2018-03-12 07:51:36

标签: ruby-on-rails ruby rspec ruby-on-rails-3.2

我的API文件中有以下代码

    class TransactionStatus < Grape::API
        helpers ::PushAPIv1::NamedParams

        post '/transaction/status' do
          Rails.logger.warn "#{params.to_xml}"
             // some piece of code
        end
      end

我试图为这种情况写Rpsec,但在我的报道报告中没有取得任何成功。我试着编写的规范如下

require 'rails_helper'
RSpec.describe Transaction, type: :request do
  context 'check Transaction Status' do
    it 'should log an info message' do
      expect(Rails.logger).to receive(:warn).with("#{params.to_xml}")
    end

    it 'should raise Transaction Not Found Error if invalid transaction' do
        transaction = FactoryGirl.build(:transaction, state: 'processing', gateway_message: 'success', ref_code: '1qqqq1')
        p transaction.ref_code
        expect { Transaction.find_by_ref_code('q1111q').should eq transaction }.to raise_error()
    end
  end
end

1 个答案:

答案 0 :(得分:1)

好吧,如果您要实现的是覆盖POST /transaction/status端点,那么......您需要在规范中找到端点,而目前您还没有这样做。< / p>

it 'should log an info message' do
  expect(Rails.logger).to receive(:warn).with("#{params.to_xml}")
end

在这里,您希望Rails.logger接收warn消息。但是你需要触发一些应该调用Rails.logger.warn来传递规范的东西。

it 'should raise Transaction Not Found Error if invalid transaction' do
  transaction = FactoryGirl.build(:transaction, state: 'processing', gateway_message: 'success', ref_code: '1qqqq1')
  expect { Transaction.find_by_ref_code('q1111q').should eq transaction }.to raise_error()
end

关于此规范:您以一种难以理解的方式混合expectshould语法。另外,您只是使用ActiveRecord方法,而且从不调用您的实际API端点。这就是为什么你没有得到任何代码覆盖。

最后,为了获得适当的端点覆盖,您应该做的是实际调用它。例如,这可以在before :each块中完成,甚至可以在每个规范中完成,如下所示:

describe 'transaction/status' do
  before :each do
    post 'path/to/api/transaction/status'
    # post 'path/to/api/transaction/status', params: { some: params }
    # post 'path/to/api/transaction/status', headers: { some: headers }
  end

  it '...' do
    expect( response ).to ...
  end
end

你明白了。您可以查看RSpec Rails 3.7 - Request specs了解更多详情和示例。