Прежде всего, позвольте мне объяснить, почему написанная вами спецификация не работает:
Вы устанавливаете ожидание, что фиктивный объект, возвращаемый mock(User)
, должен получить name=
. Есть две проблемы с этим. Прежде всего макет ничего не получит, потому что он никогда не называется. mock(User)
возвращает фиктивный объект, и его нельзя использовать для установки ожиданий того, что получит объект класса User
(для этого просто выполните User.should_receive(...)
). Во-вторых, даже если вы установили ожидание для объекта класса User
, этот объект никогда не получит name=
. Для этого тоже есть две причины: во-первых, потому что name=
(если бы он существовал) был бы методом экземпляра, и как таковой он не вызывался бы для объекта класса, и во-вторых, вы не объявляли метод экземпляра name=
. Ваш код делает то, что он устанавливает переменную экземпляра.
Теперь, как вы должны написать тест для этого? Ты не должен. Тесты должны определять и утверждать поведение, а не реализацию. Установка переменной экземпляра является чистой реализацией. В вашем примере кода нет способа получить значение переменной экземпляра @name
извне класса, поэтому нет смысла писать для него тест.
Очевидно, что ваш код - всего лишь пример, все что угодно может сделать что-то с переменной @name
, и это то, что вы должны проверить. Начните с написания теста, для которого будет использоваться объект User
, затем запишите всю реализацию, необходимую для выполнения этого теста (но не более). Напишите тест, который отражает, как объект будет использоваться в реальном производственном коде.