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
我有一个控制器方法可以随机 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