RSpeC语言 无法模拟 ActiveRecord 模型类



尝试在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

相关内容

  • 没有找到相关文章

最新更新