Имитационный вызов защищенного метода базового абстрактного класса из открытого метода производного класса с использованием Microsoft.fakes

Я пытаюсь написать модульный тест для кода, показанного ниже, используя Microsoft.Fakes.

Как новичок в Microsoft.Fakes, я сталкиваюсь с трудностями в издевательстве над вызовом функционального метода, защищенного абстрактным базовым классом.

Мой базовый класс:

public abstract class MyAbstractBaseClass
{
protected virtual int MyFunctionalBaseClassMethod(int parameter1)
{
return (parameter1 * parameter1);
}
}  

Мой дочерний класс:

public class MyChildClass : MyAbstractBaseClass
{
public int GetSquare(int parameter1) //(target method for unit test)
{
return MyFunctionalBaseClassMethod(parameter1); //(target method to mock using Fakes)
}
} 

Я пробовал следующий код модульного теста для насмешек, но не работал:

var square = 10;
var stubMyAbstractBaseClass = new Fakes.StubMyAbstractBase()
{
MyFunctionalBaseClassMethod = (a) => { return square; }
};  

Примечание. Мой защищенный метод абстрактного базового класса выполняет сложные операции, поэтому мне нужно смоделировать его. Приведенный выше код является всего лишь образцом.

Любые указатели будут оценены!


person SRS    schedule 20.12.2016    source источник
comment
Если вашей целью является GetSquare(), почему вы не можете сделать что-то вроде var x = _myChildClass.GetSquare(2); Затем вы можете Assert.IsEqual(2, x);   -  person Sasha    schedule 20.12.2016
comment
Как уже упоминалось, обратите внимание: мой абстрактный метод, защищенный базовым классом, выполняет сложные операции, поэтому мне нужно издеваться над ним. Приведенный выше код является всего лишь образцом.   -  person SRS    schedule 21.12.2016


Ответы (1)


Вам нужно заглушить MyChildClass вместо абстрактного класса. Это сработало для меня.

[TestMethod]
public void CheckAbstractClassStub()
{
    var myChild = new StubMyChildClass()
    {
        MyFunctionalBaseClassMethodInt32 = (num) => { return 49; }
    };

    int result = myChild.GetSquare(5);
    Assert.AreEqual(result, 49);
}

Изменить: Да, это защищено. Как я упоминал выше, вам нужно заглушить защищенный метод в производном классе MyChildClass. Вы заглушили абстрактный класс, там нет экземпляра, и он не будет вызываться. Если вы хотите сделать это для всех экземпляров, вы можете использовать прокладки, но в этот момент вы просто усложняете задачу.

Вот мой базовый класс и подкласс, чтобы вы могли сравнить.

public abstract class MyAbstractBaseClass
{
    protected virtual int MyFunctionalBaseClassMethod(int parameter1)
    {
        return (parameter1 * parameter1);
    }
}

public class MyChildClass : MyAbstractBaseClass
{
    public int GetSquare(int parameter1) //(target method for unit test)
    {
        return MyFunctionalBaseClassMethod(parameter1); //(target method to mock using Fakes)
    }
}

Вот скриншот кода, остановленного в точке отладки

защищенный метод, возвращающий заглушенное значение

person doobop    schedule 21.12.2016
comment
'MyFunctionalBaseClassMethodInt32 = (число) => { return 49; }' в моем случае не работает, метод базового класса не является общедоступным и защищенным. - person SRS; 21.12.2016