我的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
答案 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
关于此规范:您以一种难以理解的方式混合expect
和should
语法。另外,您只是使用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了解更多详情和示例。