如何用RSpec多次调用主题

时间:2017-09-26 15:19:50

标签: ruby rspec

我在下面创建了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

2 个答案:

答案 0 :(得分:4)

没有。 letsubjectmemoized (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