У меня есть модель под названием DeviceState
, которая содержит такие состояния, как «активный», «автономный», «онлайн».Как протестировать динамически определенные методы, основанные на другой модели
У меня есть другая модель под названием Device
, которая belongs_to
- DeviceState
.
Чтобы иметь такие методы, как @device.active?
и @device.offline?
на модели устройства, я определил динамический метод как так:
DeviceState.all.each do |method|
define_method((method.name + "?").to_sym) do
self.device_state.name == method.name
end
end
Моя проблема заключается в том, что, когда я пытаюсь создать тесты на Device
модели, динамический метод не создается, потому что модель DeviceState
не была заполнена в базе данных при запуске тестовой среды. Поэтому к моменту создания данных DeviceState
с заводской девушкой было бы слишком поздно.
Одно решение, которое я пробовал, состоит в том, чтобы выровнять DeviceState
в spec_helper
, однако в то время как это сработало для первого теста, оно не сработало для остальных, поскольку очиститель базы данных удалил данные.
Что было бы лучшим способом преодолеть эти динамически определенные методы?
Вы определенно не должны определять эти методы динамически. Это огромный запах кода. – meagar
Действительно? Но тогда каждый раз, когда мне нужно будет добавить новое состояние, мне придется добавлять новые методы в модель устройства. Теперь я просто добавляю его в модель DeviceState, и все работает. Это была идея этого. Не хорошо? – bymannan
Модель 'Устройство' загружается, когда ваш сервер запускается и не перезагружается снова (я имею в виду в ПРОИЗВОДСТВЕ), и при добавлении нового состояния вы не получите новый определенный метод. Будьте осторожны, пожалуйста. Начните свое приложение в режиме производства и протестируйте его! – gotva