编写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数据保存到电子表格中,这正是当前正在发生的事情。知道怎么做吗?
答案 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)