Старый вопрос, но так как я нашел его, когда искал, я отвечу на него следующему человеку с моим решением.
Использование MolesContext.ExecuteWithoutMoles
для вызова исходной функции в большинстве случаев работает просто отлично, однако, если вы вызываете другие функции или классы ниже по потоку от этого вызова, они также не будут смоделированы.
Дан следующий класс:
public class TheClass
{
public int TheFunction(int input){
return input + TheOtherFunction();
}
public int TheOtherFunction(){
return DateTime.Now.Minutes;
}
}
Если вы используете MolesContext.ExecuteWithoutMoles
подход:
MTheClass.AllInstances.TheOtherFunctionInt = (instance) => {
return 5;
};
MTheClass.AllInstances.TheFunctionInt = (instance, input) =>
{
//do your stuff here, for example:
Debug.WriteLine(input.ToString());
var result = MolesContext.ExecuteWithoutMoles<int>(() => instance.TheFunction(input));
//do more stuff, if desired
return result;
};
Ваш моль для OtherFunction не будет поражен, потому что он (косвенно) был выполнен в области действия "без родинок".
Однако вы можете добавлять и удалять делегатов родинок в любое время, что позволяет вам делать следующее, как описано в Документация родинок (стр. 24)
MTheClass.AllInstances.TheOtherFunctionInt = (instance) => {
return 5;
};
MolesDelegates.Func<TheClass, int, int> molesDelegate = null;
molesDelegate = (instance, input) =>
{
//do your stuff here, for example:
Debug.WriteLine(input.ToString());
int result = 0;
try{
MTheClass.AllInstances.TheFunctionInt = null;
result = instance.TheFunction(input);
}
finally{
MTheClass.AllInstances.TheFunctionInt = molesDelegate;
}
//do more stuff, if desired
return result;
};
MTheClass.AllInstances.TheFunctionInt = molesDelegate;
Кроты OtherFunction все еще поражены. С помощью этого метода вы можете удалить молдинг только с определенного метода, не влияя на другие родинки. Я использовал это, и это работает. Единственная проблема, которую я вижу, это то, что она не будет работать, если у вас есть рекурсивная функция или, возможно, многопоточная ситуация.