Я пишу единичный тест для одного из моих служебных объектов. В этом конкретном случае мне нужно было использовать транзакции для обеспечения целостности данных. Таким образом, у меня есть простой код:Тестирование и издевательство над содержимым блока с RSpec
class CreateUser
def save
user_klass.db.transaction do
user = user_klass.create(name: name, email: email)
another_model_klass.find_or_create(user_id: user.id, foo: 'foo')
end
end
end
Я использую Sequel как мой ORM. Однако важным моментом этого вопроса является, на самом деле, как проверить этот код. Я успешно использовал mocks и stubs, но это первый раз, когда я должен заглушить что-то с блоком.
В первой у меня есть наивная спецификации вроде так:
describe CreateUser do
describe "#save" do
let(:user) { instance_double("User", id: 1) }
let(:user_klass) { double("Class:User", create: user) }
let(:another_model_klass) { double("Class:AnotherModel") }
let(:name) { 'Test User' }
let(:email) { '[email protected]' }
let(:foo) { 'foo' }
let(:params) { { name: name, email: email, foo: foo } }
let!(:form) { CreateUser.new(params, user_klass, another_model_klass) }
before do
allow(another_model_klass).to receive(:find_or_create)
end
it "sends create message to the user_klass" do
expect(user_klass).to receive(:create).with({ name: name, email: email}).and_return(user)
form.save
end
it "sends find_or_create message to another_model_klass" do
expect(another_model_klass).to receive(:find_or_create).with(user_id: user.id, foo: foo)
form.save
end
end
end
Это выдает ошибку:
Double "Class:User" received unexpected message :db with (no args)
Но если я добавлю следующее:
allow(user_klass).to receive_message_chain(:db, :transaction)
Было бы заполнить содержимое блока транзакций, и он все равно будет терпеть неудачу.
Как сделать установленные ожидания на моей спецификации, где:
- ожидать транзакций используется
- ожидают создать сообщение, которое будет отправлено user_klass
- ожидают find_or_create сообщение для another_model_klass
комментарий к -1 будет уместным. возьмите на себя ответственность и дайте автору понять вашу проблему с его/ее ответом. – jaydel