在c#中使用模拟测试成员分配

时间:2016-04-14 11:30:16

标签: c# unit-testing

我正在为我的系统编写一个测试框架,它允许用户为系统创建模拟输入。系统操纵该输入,并更新其一些成员以供以后后处理。

为了允许用户模拟输入,我需要能够更新模拟输入的成员。此外,输入可能不是模拟,所以我更倾向于忽略所接收元素类型的解决方案。

简单地说,我有一个函数接收一个对象并试图设置它的一个属性:

func(object a)
a.m = 5;

我想通过使用Moq库模拟其输入a来测试。不幸的是,我的测试失败了,因为模拟对象的成员需要使用Mock.SetUpGet来设置,而不是标准成员赋值。

测试这样一个函数的好方法是什么,而不改变它?

2 个答案:

答案 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