У меня возникли проблемы с пониманием ошибки при модульном тестировании моего модуля, который является миксином.
Предположим, что тестируемый миксин - это модуль A:
require 'path/b'
module A
def methodA()
puts methodB.attr1
end
end
И это зависит отдругой миксин B, который был определен в файле по пути / b.rb
module B
def methodB
return someObject #that has property 'attr1'
end
end
Теперь у нас есть модуль для модульного тестирования A
require 'path/moduleA'
class TestA
include Path::moduleA
end
describe 'test moduleA.methodA'
it 'does something'
testObject = TestA.new
testObject.methodA()
expect(....)
end
end
При запуске я получаю следующую ошибкутест rspec
NameError:
undefined local variable or method `methodB' for #<TestA:0x00007f77a03db9a8>
Я могу решить его одним из следующих способов:
- , включая модуль B в модуле A
- , включая модуль B в классеTestA
Вопросы
Мне не ясно, почему для получения доступа к methodB в модуле A и классе TestA требуется 'include'require 'уже был добавлен в модуль A.
Мое намерение состоит в том, чтобы использовать методы модуля B в модуле A, но не позволять пользователям модуля A обращаться к методам модуля B автоматически.
Разрешение 1 выше предоставляет пользователям A доступ к методам B
Разрешение 2 вынуждает пользователей A (пользователь -> класс модульного тестированияв этом примере) включить зависимость A напрямую от B, даже если пользователь заинтересован только в доступе к методам A.
Следовательно, оба разрешения не достигают того, что яхочу.Есть ли способ достичь этого?
Я новичок в Ruby, так что, возможно, он этого не поддерживает.Я из Java-среды, где я бы смоделировал A и B как два класса, сделал бы экземпляр B в качестве поля A, а затем представил собственные публичные методы A для пользователей A. Но, поскольку они являются миксинами, мне нужно использовать модули врубин.