Как вызвать оригинальный метод, который включает в себя вызов ложного метода?
Я использую MS Fakes.
Дайте следующий класс:
public class Person
{
public void SaveQuotes()
{
DoSomething();
}
private void DoSomething()
{
Console.WriteLine("Original DoSomething called.");
}
}
и этот тест:
[TestMethod]
public void TestMethod1()
{
using (ShimsContext.Create())
{
var sut = new ShimPerson();
sut.DoSomething = () => { Console.WriteLine("Called from test"); };
sut.Instance.SaveQuotes();
}
}
Когда я запускаю тест, sut.Instance.SaveQuotes()
Метод в основном пропущен, так как этот метод был отброшен. Что я хочу, это выполнить оригинал SaveQuotes()
метод. Итак, я попробовал это:
[TestMethod]
public void TestMethod1()
{
using (ShimsContext.Create())
{
var sut = new ShimPerson();
sut.DoSomething = () => { Console.WriteLine("Called from test"); };
sut.SaveQuotes = () => { ShimsContext.ExecuteWithoutShims(() => sut.Instance.SaveQuotes()); };
sut.Instance.SaveQuotes();
}
}
Когда я запускаю тест сейчас, он выполняет оригинальный SaveQuotes()
, но в качестве побочного эффекта он также запускает оригинал DoSomething()
метод тоже.
Как я могу запустить оригинал SaveQuotes()
но фальшивый DoSomething()
, TypeMock сделает это .CallOriginal
вариант при настройке подделок, но я не вижу, как сделать то же самое в MS Fakes.
1 ответ
Хорошо, я понял это сейчас.
Я должен был изменить ShimBehaviors.InstanceBeahviour
свойство вроде так:
[TestMethod]
public void TestMethod1()
{
using (ShimsContext.Create())
{
var sutShim = new ShimPerson();
sutShim.DoSomething = () => { Console.WriteLine("Called from test"); };
sutShim.InstanceBehavior = ShimBehaviors.Fallthrough;
sutShim.Instance.SaveQuotes();
}
}
Это говорит подделкам называть оригинал SaveQuotes()
метод, в то время как по-прежнему используется DoSomething()
метод. Я нашел это, чтобы быть хорошей ссылкой: