В соответствии с документацией для модуля delegate
rails:
Если объект делегата равен nil, возникает исключение, и это происходит независимо от того, отвечает ли nil на делегированный метод.Вместо этого вы можете получить nil с опцией: allow_nil.
Я бы создал объект Event event
с nil league
или установил event.league = nil
, затем попытался бы вызвать event.name
и проверьте, что это вызывает исключение, так как это то, что должно происходить, когда allow_nil
ложно (что также является значением по умолчанию).Я знаю, что в rspec есть такая идиома для тестирования исключений:
lambda{dangerous_operation}.should raise_exception(optional_exception_class)
Я не уверен, есть ли у конструкции musta такая конструкция, хотя есть несколько статей, довольно старых, о том, как получить такое поведение в musta.
Я думаю, что это стоит проверить, если поведение этого класса может ожидать или предполагать, что произойдут пользователи этого класса - что, я думаю, вероятно верно в этом случае.Я бы не стал расширять musta для проверки «делегировать», потому что это кажется более зависимым от реализации: вы действительно говорите, что ваше событие должно вызывать исключение, если вы пытаетесь вызвать #name
, когда у него нулевая лига .Для пользователей Event совершенно неважно, как вы это делаете.Я бы даже зашел так далеко, если вы хотите заявить и отметить это поведение, чтобы проверить, что Event#name
имеет ту же семантику, что и League#name
, без , не упоминая о delegate
, посколькуэто подход, ориентированный на поведение.
Создайте свои тесты, основываясь на том, как ваш код ведет себя, а не на том, как он построен - тестирование таким способом - лучшая документация для тех, кто сталкивается с вашими тестами, поскольку они больше заинтересованына вопрос "почему мое событие бросает?"или "что может вызвать событие?"чем это делегирование этого события?
Вы можете выделить такую ситуацию, представив, какие могут быть сбои, если вы измените свой код так, чтобы пользователи Event не заботились.Если они не заботятся об этом, тест не должен прерываться, когда вы меняете его.Что если вы захотите, например, самостоятельно обработать делегирование, написав функцию #name
, которая сначала регистрирует или увеличивает счетчик, а , а затем делегирует league
?протестировав поведение, вызывающее исключения, вы защищены от этого изменения, но, проверив, является ли Event делегатом, вы прервете этот тест, когда внесете это изменение - и поэтому ваш тест не смотрел на то, что на самом деле важно о звонке на #name
.
Во всяком случае, это все только разговоры в мыльной коробке.tl; dr: протестируйте, если это поведение, на которое кто-то может положиться.Все, что не было проверено, это кот Шредингера: сломанный и не сломанный одновременно.По правде говоря, большую часть времени это может быть хорошо: вопрос вкуса, хотите ли вы сказать что-то строгое и окончательно о том, как должна вести себя система, или просто позволить ей быть «неопределенным поведением».