2015-01-24 2 views
0

Я пытаюсь определить методы, которые являются частями большую часть времени, но не всегда. Например:Чаще всего методы

class Service 

    def initialize(repo) 
     @repo = repo 
    end 

    private def repo 
     @repo 
    end 

    def all 
     repo.all 
    end 
end 

Мой класс Service будет осуществлять функции вокруг репозитория объекта. Я хочу полностью скрыть объект repo, чтобы предотвратить его утечку в мой производственный код.

Однако при отладке или тестировании я хочу быть ленивым и позвонить по телефону service.repo напрямую, используя service.send :repo.

Я думал о загрузке расширения класса или загрязнена ENV проверки склонения для моих тестов и консоли, однако, что предотвращает мои тесты от взлома если код внутри ./lib/* делает плохое использование частных методов во время выполнения теста.

Теперь я изучаю с уточнениями, но это требует слишком много шаблонного и я хочу сделать некоторые декоратор, как это:

+LibPrivate 
def repo 
    @repo 
end 

Это является Python like decorator, но я считаю, так как Руби 2.1 можно было бы определить пользовательские модификаторы за пределами частного/общедоступного без этого драгоценного камня

ответ

1

Просто измените видимость метода в вашем тестовом помощнике или в тестовом файле.

Service.class_eval do 
    public :repo 
end 

Просто имейте в виду, что частный метод находится в теоретической реализации деталей. Вы не должны проверять частные методы. В общем, вы проверяете поведение первого публичного метода, который зависит от частного.

Если вы считаете, что вам нужно, тогда может быть случай, когда метод не должен быть закрытым.

Это правило не должно применяться вслепую, но хорошо помнить об этом.

+0

Это ломается точно состояние моего вопроса. После этого патча обезьяны мои тесты не будут ломаться, если другие части моего кода в «lib /» используют частные вызовы, но ломают производство. – SystematicFrank

+0

Вы можете обернуть класс в прокси, но он будет более сложным, просто используя 'send: foo'. У вас мало альтернатив. Вы либо изменяете область действия для конкретного процесса, либо используете 'send' –

+0

Избегание деталей реализации не всегда возможно. Например, в моей «службе» я никогда не захочу предоставить счет или пользовательский запрос. Однако, если я избегу этой детали реализации, у меня будет много ненужного шаблона конфигурации базы данных. – SystematicFrank

Смежные вопросы