Я пишу тесты для нашего приложения на C # 7 и борюсь с издевательством над конкретным методом. Я использую TypeMock 8.6.10.3.
Вот упрощенный пример:
// Returns some data
class InnerClass
{
private readonly string _description;
public InnerClass(string description)
{
_description = description;
}
// This is the method I want to fake.
public string GetDescription()
{
return _description;
}
}
// Calls InnerClass
class OuterClass
{
public void DoSth()
{
// Instance of InnerClass is created in this method scope.
// This instance is not accessible from outside.
var innerClass = new InnerClass("InnerClassDescription");
var d = innerClass.GetDescription();
}
}
public class TestFixture
{
public void Test()
{
// I want to fake the method "InnerClass.GetDescription()"
// which is called by "OuterClass.DoSth()".
// I don't have access to the InnerClass instance though.
// So unfortunately I have to fake them all.
var fakedInnerClasses = Isolate.Fake.AllInstances<InnerClass>();
Isolate.WhenCalled(() => fakedInnerClasses.GetDescription()).DoInstead(
c =>
{
// I create another instance of OuterClass...
var oc2 = new OuterClass();
// ...and call the same method GetDescription() indirectly again.
// I would expect that the test goes
// into this faked method one more time.
// But it does not. The real GetDescription() is called.
// How to change this behavior?
return oc2.DoSth();
});
var oc1 = new OuterClass();
// Because DoSth() calls GetDescription()
// the test will go to the faked method right above.
oc1.DoSth();
}
}
Я также попытался подделать метод GetDescription()
еще раз в самом фальшивом методе (вложенныйWhenCalled()
звонок). Надеясь, что второй звонок войдет туда. Но, насколько я знаю, вторая подделка просто перезаписывает первую.
В реальном приложении GetDescription()
принимает некоторые параметры. Я мог бы подделать GetDescription()
дважды, используя WithExactArguments()
. Таким образом, я мог дифференцировать звонки. Но поскольку GetDescription()
является методом расширения, я не нашел способа подделать параметр this
. Подделка всех экземпляров не работает.
Мне действительно нужны вопросы, и мне нужен один ответ для решения моей проблемы:
- Могу ли я подделать конкретный экземпляр, не имея возможности получить к нему доступ? (
InnerClass
экземпляр в методе DoSth()
)? Пока я знаю, что это невозможно. - Могу ли я вызвать фальшивый метод второй раз, второй раз в самом фальшивом методе, и предположить, что второй вызов снова завершится в этом фальшивом методе (вызов
GetDescription()
опять в фальшивом GetDescription()
звонке)?