我在下面创建了RSpec测试。我尝试多次致电subject
。但我无法得到预期的结果。我打电话给subject
三次,不是吗?所以,我期待三本书记录。 subject
无法拨打一次电话吗?
require 'rails_helper'
RSpec.describe Book, type: :model do
context 'some context' do
subject { Book.create }
before do
subject
end
it 'something happen' do
subject
expect { subject }.to change{ Book.count }.from(0).to(3)
end
end
end
答案 0 :(得分:4)
没有。 let
和subject
为memoized (and lazy-loaded)。
您可以像这样更改
subject { 3.times { Book.create } }
it 'something happen' do
expect { subject }.to change{ Book.count }.from(0).to(3)
end
或者如果你(无论出于何种原因)想要调用3次 - 定义一个方法:
subject { create_book }
def create_book
Book.create
end
before do
create_book
end
it 'something happen' do
create_book
expect { subject }.to change{ Book.count }.from(2).to(3)
end
然后它将被调用3次:一次在阻塞之前,一次在预期之前,一次在期望之内(但改变将来自2
而不是来自0
,因为那些是2次之前被称为
答案 1 :(得分:1)
如果您不想记住结果,也可以使用Proc
describe MyClass do
let(:param_1) { 'some memoized string' }
let(described_method) { Proc.new { described_class.do_something(param_1) } }
it 'can run the method twice without memoization' do
expect(described_method.call).to have_key(:success) # => {success: true}
expect(described_method.call).to have_key(:error) # => {error: 'cant call do_something with same param twice'}
end
end