Rails/Rspec - 如何在控制器测试中存根模型方法?

Rails/Rspec - How to stub a model method inside of a controller test?

我有一个控制器方法可以随机 return 不同的对象。我怎样才能消除随机化方法,使其始终 return 为真或为假,以便我可以测试响应?

示例控制器:

class TaskController
  def next 
    if(Tasks.assign_random_test?)
      Tasks.next_test
    else 
      Tasks.next_task
    end
  end
end

ActiveRecord 模型:

class Tasks << ActiveRecord::Base
  def self.assign_random_test? 
    rand() > 0.899
  end

  def self.next_test
   # ...
  end

  def self.next_task
   # ... 
  end
end

RSpec 测试

RSpec.describe TaskController, type :controller do 
  it 'can return a test task' do 
   # force random method to return true here? 
  end
end

allow(Tasks).to receive(:assign_random_test?).and_return(true)

RSpec.describe TaskController, type :controller do 
  describe '#next' do
    before do
      allow(Tasks).to receive(:assign_random_test?).and_return(true)
    end

    context 'when assign_random_test' do
      it 'should return result' do
        #your test here
      end 
    end

    context 'when not assign_random_test' do
      before do
        allow(Tasks).to receive(:assign_random_test?).and_return(false)
      end
      it 'should return result' do
        #your test here
      end 
    end
  end 
end