我正在尝试使用 Microsoft.Fakes 为下面显示的代码编写单元测试。
作为微软的新手.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; }
};
注意:我的抽象基类保护方法执行复杂的操作,所以我需要模拟它。上面的代码只是一个示例。
任何指针都将不胜感激!
答案 0 :(得分:2)
你需要删除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)
}
}
这是在调试点停止的代码的屏幕截图