2016-05-05 4 views
3

У меня есть частный метод в контроллереRails контроллер тестирования частный метод с Params

private 
    def body_builder 
    review_queue = ReviewQueueApplication.where(id: params[:review_queue_id]).first 
    ... 
    ... 
    end 

Я хотел бы проверить только метод body_builder, это методы ПОСТРОЕНИЯ полезной нагрузки для отдыха вызова клиента API. Однако ему нужен доступ к параметрам.

describe ReviewQueueApplicationsController, type: :controller do 
    describe "when calling the post_review action" do 
    it "should have the correct payload setup" do 
     @review_queue_application = ReviewQueueApplication.create!(application_id: 1) 
     params = ActionController::Parameters.new({ review_queue_id: @review_queue_application.id }) 
     expect(controller.send(:body_builder)).to eq(nil) 
    end 
    end 
end 

Если я запускаю выше него будет посылать метод body_builder, но тогда она будет ломаться, потому что Титулы не были установлены правильно, как они будут находиться в обращении к действию.

Я всегда мог создать условный параметр для метода body_builder так, что он либо принимает аргумент, или он будет использовать Params как этот def body_builder(review_queue_id = params[:review_queue_id]), а затем в тесте controller.send(:body_builder, params), но я чувствую, что изменить код, чтобы сделать тест пройти неправильно, он должен просто проверить его как есть.

Как я могу получить параметры в контроллере, прежде чем отправлять частный метод?

+0

Мое предложение состояло в том, чтобы на самом деле ЗВОНОТЬ точку входа RESTful с правильными параметрами. Если у вас есть поведение, которое должно произойти до того, как ваш метод body_builder может быть вызван, вы можете высмеивать и заглушить, чтобы передать исполнение по правильному пути. Затем вы помещаете ожидание в метод controller.body_builder, а не просто вызываете его. Я понимаю, что это тяжелее, чем просто вызов частного метода, но я всегда чувствовал, что если вы вызываете частные частные методы непосредственно в тестах, вы как бы выходите за пределы тестовой «песочницы» для этого объекта. – jaydel

+0

@jaydel, я полностью понимаю, откуда вы пришли, единственная проблема заключается в тестировании фактического вызова в точку входа, так как он отключит действие «RestClient :: Request», которое уже проверено, я хочу предположить, что эта часть работает правильно, но строительство полезной нагрузки игнорируется, если мы добавим вещи в полезную нагрузку, которую она не ожидает, что она потерпит неудачу. – TheLegend

+1

Да, я понимаю вашу озабоченность. Я не знаком с деталями этого конкретного поведения, но возможно ли издеваться над этой частью и собирать эту полезную нагрузку так, как вы хотите протестировать. Я бродил за пределами контекста, который я понимаю, и вы знаете это намного лучше, чем я, конечно. так что просто пища для размышлений – jaydel

ответ

2

Я думаю, вы должны быть в состоянии заменить

params = ActionController::Parameters.new({ review_queue_id: @review_queue_application.id }) 

с

controller.params = ActionController::Parameters.new({ review_queue_id: @review_queue_application.id }) 

и вы должны быть хорошо. Параметр - это только атрибут контроллера (фактический атрибут - @_params, но есть способы доступа к этому ivar. Попробуйте поставить controller.inspect в виде).

+0

Кстати, сказав это, вы не должны тестировать частные методы, конечно ;-) – niels

+1

не должен их тестировать *** прямо ***, возможно? Если они сложны и имеют логику, которая может пойти не так, они должны быть проверены, на мой взгляд. – jaydel

+0

У меня есть небольшая политика, которая есть, если я получаю исключение: я сразу же начинаю процесс, написав тест. Таким образом, я знаю, что никогда не получу исключения, большинство моих личных методов несут тяжелые требования к IP и немного ломаются. Несмотря на то, что это кажется грязным, если вы отсылаете эти методы, я думаю, что если действительно сложно проверить частные методы, то что-то не так с классом, который я пишу. – TheLegend

Смежные вопросы