2015-05-26 1 views
0

У меня есть контроллер со следующим кодом.Как заглушить себя методы в контроллере rails

def apply 
    file_id = params[:file_id] 

    if file_id.nil? && params[:file].nil? 
    render json: '"No resume was provided"', status: :unprocessable_entity 
    return 
    end 

    if params[:job_id].nil? 
    render json: '"Invalid data was posted"', status: :unprocessable_entity 
    return 
    end 

    job = Job.find(params[:job_id]) if Job.exists?(params[:job_id]) 
    if job.nil? 
    render json: '"Unable to locate job for application"', status: :unprocessable_entity 
    return 
    end 

    if file_id.nil? || file_id.to_i == 0 
    resume = ApiController.save_file job.owner 
    else 
    resume = UploadedFile.find(file_id) 
    end 

    resume.person = ApiController.save_person(job.owner) 
    resume.save_by(job.owner) 

    render json: '"successfully saved application"', status: 200 
end 

def self.save_file(owner) 
    resume = UploadedFile.new 
    resume.attachment = params[:file] 
    resume.owner = owner 
    unless resume.save_by(User.system) 
    render json: '"There was an error uploading this file, please make sure the file type is an accepted file type."', status: :unprocessable_entity 
    return 
    end 
    return resume 
end 

def self.save_person(owner) 
    person = Person.new(apply_params.permit(:first_name, :last_name, :zip)) 
    ... 

    result = person.save_by(owner) 

    unless result 
    render json: '"Errors occurred while saving person."', status: :unprocessable_entity 
    return 
    end 

    return person 
end 

Я пытаюсь проверить все 3 метода по отдельности, но так как применять метод вызывает save_file и save_person методы, я думаю, что нужно окурок те при тестировании метода применяются, верно? Итак, что привело меня к этому коду ...

describe 'apply' do 

    before(:each) do 
     @file = Rack::Test::UploadedFile.new(Rails.root.join('spec/fixtures/files/test-resume.txt'), 'plain/text') 
     @fake_uploaded_file = UploadedFile.new 
     @fake_job = Job.new 
     @fake_job.id = 1 
     @fake_person = Person.new 
     allow(Job).to receive(:find).and_return(@fake_job) 
     allow(Job).to receive(:exists?).and_return(true) 
     allow(UploadedFile).to receive(:find).and_return(@fake_uploaded_file) 
     allow(controller).to receive(:save_file).and_return(@fake_uploaded_file) 
     allow(controller).to receive(:save_person).and_return(@fake_person) 
    end 

    it 'accepts an uploaded file and saves it' do 
     post :apply, file: @file, job_id:1, format: :json 
     expect(controller).to receive(:save_file) 
    end 
    end 

Когда я пытаюсь запустить этот тест, я получаю сообщение об ошибке, что ApiController не реализует: save_file Как правильно проверить это применить метод гасит save_file и save_person методы? Благодарю.

+0

Я думаю, что принцип единой ответственности должен играть здесь - диспетчер не должен делать все это, и это затрудняет эффективное тестирование. Я бы реорганизовал их на классы и тестировал эти классы индивидуально. Редактирование: вы должны были бы заглушить классы в тесте контроллера, чтобы протестировать сам контроллер. – RichardAE

+0

Да, я думаю, мне определенно нужно реорганизовать это для SRP. Благодарю. –

ответ

0

save_file и save_person методы являются методами класса. поэтому они должны быть заострены таким образом.

allow(ApiController).to receive(:save_file).and_return(@fake_uploaded_file) 
allow(ApiController).to receive(:save_person).and_return(@fake_person) 
+0

Спасибо. Я попробовал allow_any_instance_of (ApiController) и разрешил (контроллер), но не работал. Это работало ... или, по крайней мере, дополнило меня через стек вызовов. –