我正在为我的系统编写一个测试框架,它允许用户为系统创建模拟输入。系统操纵该输入,并更新其一些成员以供以后后处理。
为了允许用户模拟输入,我需要能够更新模拟输入的成员。此外,输入可能不是模拟,所以我更倾向于忽略所接收元素类型的解决方案。
简单地说,我有一个函数接收一个对象并试图设置它的一个属性:
func(object a)
a.m = 5;
我想通过使用Moq库模拟其输入a来测试。不幸的是,我的测试失败了,因为模拟对象的成员需要使用Mock.SetUpGet
来设置,而不是标准成员赋值。
测试这样一个函数的好方法是什么,而不改变它?
答案 0 :(得分:0)
为了能够模拟和测试它,该属性必须是virtual
,但如果是这种情况,您可以使用SetupSet
方法,而不是SetupGet
:
public class A
{
public virtual int m { get; set; }
}
[TestFixture]
public class Tests
{
public static void SetProperty(A a)
{
a.m = 5;
}
[Test]
public void IsThePropertySet()
{
var x = new Mock<A>();
x.SetupSet<int>(a => a.m = 5).Verifiable();
SetProperty(x.Object);
x.Verify();
}
}
答案 1 :(得分:0)
无论如何,你的功能应该有getter和setter。
测试您的功能是否有效的一种好方法是进行小规模测试。初始化一个对象并将其发送到您的方法,看它是否符合您的要求。
public class myClass
{
public int number;
public void setNumber(int nNum)
{
number = nNum;
}
public int getNumber()
{
return number;
}
}
class Program
{
static void myMethod(myClass obj, int nNumb)
{
//obj.setNumber(nNumb);
obj.number = nNumb;
}
static void Main(string[] args)
{
myClass myObj = new myClass();
myMethod(myObj, 3);
//Console.WriteLine(myObj.getNumber());
Console.WriteLine(myObj.number);
Console.ReadLine();
}
}
}
输出:3