尝试在RSpec单元测试中模拟ActiveRecord模型类。我在这里总结一些东西。
RSpec测试
it 'calls create method' do
response_code = post @url, params: { id: @id }
expect(response_code).to eql(200)
allow(MyModel).to receive(:create)
expect(MyModel).to receive(:create)
end
控制器方法
控制器入口点。
def controller_method
other_model_method
#...
render json: #...
end
调用MyModel的其他模型
Class OtherModel < ActiveRecord
#...
def other_model_method
MyModel.create(attr: value)
end
end
运行我得到的测试:
(MyModel(id: integer).create(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
我是Rails和Ruby的新手。这对allow(MyModel(/expect(MySModel(我在另一篇帖子中看到了,但对我不起作用。我做错了什么?
首先,最好在触发操作之前执行allow
调用。然后你需要使用过去时匹配器来检查你的mock是否被调用。
养成这个习惯的好处是,你在测试中使用了相同的风格,你只需要模仿一些东西,就像你关心针对这些模仿设定期望一样。
类似这样的东西:
it 'calls create method' do
allow(MyModel).to receive(:create)
response_code = post @url, params: { id: @id }
expect(response_code).to eq(200)
expect(MyModel).to have_received(:create).with(some: value)
end
您可以将some: value
替换为您期望调用mock的任何内容。
如果在同一规范中的许多测试中都这样做,那么可以将allow
调用转移到before
块。像这样:
before do
allow(MyModel).to receive(:create)
end
it 'calls create method' do
response_code = post @url, params: { id: @id }
expect(response_code).to eq(200)
expect(MyModel).to have_received(:create).with(some: value)
end
您的模拟期望应该在代码调用它们之前在测试中发生,因此
it 'calls create method' do
expect(MyModel).to receive(:create)
response_code = post @url, params: { id: @id }
expect(response_code).to eql(200)
end