Я немного пользуюсь родинками и считаю, что это очень полезно для небольших проектов.
Однако при работе с модульными тестами, требующими более сложных задач компоновки, модульные тесты требуют FOREVER.
Если я запускаю код модульного теста без назначения атрибута HostType ("Moles"), компоновкаоперация занимает <10 секунд (при запуске заданного контекста его операция <2 секунды).Добавление атрибута хоста Moles увеличивает это время до 4-5 минут. </p>
Что происходит и что я могу с этим сделать?
---- Обновление в отношениина ответ BryanBCook.
Ниже приведен код (немного отредактированный), который, похоже, является проблемой.Если проблема заключается в переписывании родинок IL, то, кажется, это происходит в месте, которое я не ожидал бы, что должно.Вы знаете, переписывает ли это все?Думаю, мне также любопытно узнать, является ли это просто проблемой с масштабированием в хост-процессе moles.
[ClassInitialize()]
public static void ClassInit(TestContext ctx)
{
Common.Logging.Moles.MExceptionEvent.LogExceptionStringStringStringString = delegate(Exception ex, string a, string b, string c, string d)
{
Debug.WriteLine(String.Format("Exception occurred in test context '{0}' : {1} ", ctx.TestName, ex.ToString()));
};
Common.Logging.Moles.MCriticalEvent.LogStringStringTraceEventTypeStringString = delegate(string a, string b, TraceEventType tet, string c, string d)
{
Debug.WriteLine(String.Format("Critical Event occurred in test context '{0}' : {1} ", ctx.TestName, a));
};
Common.Logging.Moles.MDebugEvent.LogStringStringTraceEventTypeStringString = delegate(string a, string b, TraceEventType tet, string c, string d)
{
//Debug.WriteLine(String.Format("Debug Event occurred in test context '{0}' : {1} ", ctx.TestName, a));
};
/*there are about 1MM lines of code that generate this dataset.*/
DataSet _ds = dg.STDDataHelper.GenerateDataSet();
/*This is where the delay occurs*/
m_std = new STD(_ds);
/*Now another object (implements web caching) gets moled to use the newly constructed object*/
BizObjects.Moles.MSCO.STDs = delegate()
{
return m_std;
};
m_co1 = new Company(dg.Company.CTSDataHelper.COMPANY_ONE_CODE);
m_co1.HydrateCoTaxDefinitions(dg.Company.CTSDataHelper.GenerateCompanyOneDataset());
m_co2 = new Company(dg.Company.CTSDataHelper.COMPANY_ONE_CODE);
m_co2.HydrateCoTaxDefinitions(dg.Company.CTSDataHelper.GenerateCompanyTwoDataset());
}
--- Другое обновление
Так что переставим класс init так, чтобыродинки журналирования происходят после того, как STD инициализируется, и удаление 3 операторов ведения журнала отладки (они были действительно бесполезны) во всем этом дереве конструирования объекта STD сократило операции компоновки до полутора минут.
Хотя это не является оптимальным (исключения в построении дерева объектов STD не пройдут тест, а будут проверены), это все же лучше, чем платить штраф.Тем более, что входные данные конструкции жестко контролируются.
При этом я также заметил, что в хост-процессе moles используется только около 138 МБ оперативной памяти и 13% процессора.Без кротов (и добавления всех зависимостей к модульному тесту) стандартный хост будет использовать гораздо больше (у этого компа есть i7 Quad и 8 Гбайт оперативной памяти - есть много места для запаса).Похоже, что процесс хоста родинок достиг своего рода предела.