Как автор камня VCR, вы, вероятно, ожидаете, что я порекомендую его для подобных случаев.Я действительно рекомендую его для тестирования HTTP-зависимого кода, но я думаю, что есть основная проблема с вашим дизайном.Не забывайте, что TDD (разработка через тестирование) призвана стать дисциплиной проектирования, и когда вам сложно испытать что-либо, это говорит вам о вашем дизайне.Прислушайтесь к боли ваших тестов!
В этом случае, я думаю, ваша модель не имеет никакого дела к вызову API сторонних производителей.Это довольно существенное нарушение принципа единой ответственности.Модели должны нести ответственность за проверку и сохранение некоторых данных, но это определенно выходит за рамки этого.
Вместо этого я бы порекомендовал вам перенести сторонний вызов API в наблюдателя.У Пэта Мэддокса есть отличное сообщение в блоге , в котором обсуждается, как можно (и нужно) использовать наблюдателей, чтобы свободно соединять вещи, не нарушая SRP (принцип единой ответственности), и как это делает тестирование намного, намного проще, а такжеулучшает ваш дизайн.
Как только вы переместили это в наблюдателя, достаточно просто отключить наблюдателя в ваших модульных тестах (за исключением специальных тестов для этого наблюдателя), но оставить его включенным в производстве и вваши интеграционные тесты.Вы можете использовать плагин Пата no-peeping-toms , чтобы помочь с этим, или, если вы на рельсах 3.1, вы должны проверить новую функциональность , встроенную в ActiveModel, которая позволяетВы легко включаете / отключаете наблюдателей .