Хорошо, здесь есть несколько частей.
Во-первых, я настроил проект WB для проверки вашего ввода, и хотя я получаю те же сообщения об ошибках при запуске модульного теста, я не получаю зависание ядра - скорее, я либо получаю тест не пройдено (если я не оберну тестовый код в Quiet
- пояснение см. ниже), либо завершается преждевременно (причину также см. ниже). Но обратите внимание, что я изменил имя контекста oosys'
(см. также ниже).
Следует проверить, что в проекте WB контексты ваших пакетов должны быть подконтекстами основного контекста вашего приложения. Поэтому oosys'
становится (в моем случае) OOSystemTests'oosys'
. Это должно отражаться как в самом пакете, так и в импорте пакетов (вызовы Needs
ets). Например, ваша версия oosys
будет начинаться как BeginPackage["OOSystemTests'oosys'"];
(замените одинарные кавычки контекстными метками).
Далее, полезно знать, что сообщения, созданные во время запуска модульного теста, по умолчанию считаются ошибкой, поэтому тест не будет выполнен. Вы можете указать, что сообщения ожидаются, чтобы этого избежать (см. эту страницу для получения подробной информации), или вы можете обернуть свой тестовый код в Quiet
). Вы должны сделать что-то из этого, чтобы пройти через него до конца вашего теста (я завернул тестовый код в Quiet
).
Как только вы это сделаете, ваш тест запустится, но MUnit
сообщит о преждевременном завершении работы ядра. И это возвращает нас к приложению OO System
. На мой взгляд, в нем есть интересные идеи, но он не может считаться профессионально написанным пакетом расширения mma по нескольким причинам. Во-первых, причина преждевременного выхода: если вы посмотрите на реализацию loadClass
, вы заметите вызов функции checkClass
, внутри которой вы можете увидеть ряд вызовов Quit[]
. Я не знаю, должен ли я объяснять, почему это неправильный способ сделать это, но я довольно много сказал о методы сообщения об ошибках ранее, и вызов Quit[]
внутри функции более низкого уровня не указан там по какой-то причине. Это даже не специфично для mma: в программной инженерии принято считать, что функции более низкого уровня обычно не должны принимать масштабные решения, к которым обращаются только функции высокого уровня (например, выход из приложения). Еще одно место, которое я заметил при очень поверхностном чтении кода, находится в функции newContext
, где контекст oosys'
указан явно как строка (жестко закодированная), что означает возможность разрыва всякий раз, когда имя контекста изменяется (скажем, как в нашем случае). То, как организована отладка, мне тоже не кажется очень увлекательной. Возможно, есть и другие вещи, я не очень внимательно читал.
Надеюсь, я дал достаточно указаний, чтобы вы могли пройти через MUnit
с желаемым результатом, возможно, изменив в процессе часть исходного кода ОО-системы (если ее лицензия позволяет это). В связи с этим я бы повторил совет, который уже давал вам: если вы хотите использовать его действительно продуктивно, внимательно читайте код, берите хорошие идеи (которые, я уверен, там есть) и реализуйте собственную объектную модель в так, как вы этого хотите, чтобы вы контролировали весь код.
person
Leonid Shifrin
schedule
01.08.2011