控制器测试忽略操作中的某些方法

时间:2014-01-23 05:20:03

标签: ruby-on-rails rspec factory-bot

编写Rspec控制器测试,但试图忽略某些方法,即实际通过API(例如,Mail Chimp或Google Drive)将内容发布到第三方的方法。

例如我的控制器代码:

def create
@request = Request.new(request_params)
if @request.save
  flash[:success] = true
  @request.save_spreadsheet
  RequestMailer.confirmation_email(@request, request.host_with_port).deliver
  redirect_to edit_request_path(@request.edit_id)
else
  render 'new'
end
end

save_spreadsheet是一种保存到Google电子表格的方法。当我测试控制器时,例如:

describe "POST create - with valid data" do
    it "creates a new request" do
        expect{
            post :create, request: FactoryGirl.attributes_for(:request)
        }.to change(Request,:count).by(1)
    end
end

我想测试控制器,但实际上并没有将FactoryGirl数据保存到电子表格中,这正是当前正在发生的事情。知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

您可以存根方法以确保它被调用。

expect(RequestMailer).to receive(:confirmation_email).with(anything)
post :create, request: FactoryGirl.attributes_for(:request)

上面的示例假设有任何参数,您也可以在with中指定它们。

答案 1 :(得分:0)

你需要存储许多东西,这可能是一种气味 - 所以首先考虑如何使这个测试变得更容易,以及什么样的实现可以促使你。

如果你想按原样测试这个实现,你需要这些内容:

params = { ... }
request = Request.new(params)
request.stub(:save_spreadsheet)
Request.stub(:new).with(params).and_return(request)
mailer = double("Mailer")
mailer.stub(:deliver)
RequestMailer.stub(:confirmation_email).with(request, ...).and_return(mailer)

expect { post :create, request: params }.to change(Request, :count).by(1)