Я пишу тесты Rspec для объекта службы, который касается нескольких моделей, но я чувствую, что мой тест слишком зависит от внутренних компонентов метода и поэтому не имеет большого значения. Вот пример:
class MealServicer
def self.serve_meal(meal, customer)
meal.update_attributes(status: "served", customer_id: customer.id)
order = customer.order
OrderServicer.add_meal_to_order(meal, order)
CRM.update_customer_record(customer) // external API call
end
end
Я хотел бы использовать double/stubs для издевательства над тем, чтобы ничего не сохранять в тестовой базе данных (для повышения производительности). Но если я создаю дубликаты, отвечающие на сообщения, то мне кажется, что я тестирую одну конкретную реализацию метода serve_meal(), и этот тест слишком связан с этой конкретной реализацией. Например, мне нужно убедиться, что мой customer
double отвечает на order
и возвращает заглушку order
. По сути, когда все просто двойное, и я должен явно указать все зависимости, убедившись, что двойники возвращают другие удвоения, похоже, что тесты заканчиваются довольно бессмысленными. См. Здесь:
it "has a working serve_meal method" do
meal = double(:meal)
customer = double(:customer)
order = double(:order)
allow(customer).to_receive(:order).and_return(order)
allow(OrderServicer).to_receive(:add_meal_to_order).and_return(true)
allow(CRM).to_receive(:update_customer_record).and_return(true)
expect(meal).to receive(:update_attributes).once
expect(OrderServicer).to receive(:add_meal_to_order).once
expect(CRM).to receive(:update_customer_record).once
end
Есть ли другой способ проверить это полностью и осмысленно, кроме создания объектов, связанных с продуктом, клиентом и заказом, соответствующим образом (и, возможно, сохраненным в базе данных), а затем проверить, что MealServicer.serve_meal (...) обновляет свойства объекта, как ожидалось? В конечном итоге это приведет к сохранению базы данных, поскольку update_attributes выполняет вызов сохранения, а также некоторые из методов, которые я намерен включить в мой метод объектов службы.
Наконец, поскольку тесты зависят от реализации, я не могу написать тесты перед методом, что рекомендуют сторонники TDD. Это просто отвратительно. Любые советы по написанию исполнителей, но полезные тесты?