如何使用Fakes

时间:2016-03-10 13:27:18

标签: c# .net c#-4.0 microsoft-fakes

我有一个方法如下,我想用Fakes模拟。在这方面有任何帮助真的很感激吗?

IEnumerable<T> ExecuteReader<T>(
    string commandText, 
    Func<IDataRecord, T> returnFunc, 
    int timeOut = 30);

1 个答案:

答案 0 :(得分:1)

假设您已经为相关的接口/类生成了伪装配,那么它取决于您是使用接口(或虚拟方法)来定义方法还是仅使用类。如果是接口或虚拟方法,则可以使用类似

的存根
    [TestMethod]
    public void StubFuncTest()
    {
        StubITestReader stubClass = new StubITestReader();
        stubClass.ExecuteReaderOf1StringFuncOfIDataRecordM0Int32<int>((str, func, timeout) =>
        {
            int[] retVal = {12, 25, 15};
            return retVal;
        });

        ITestReader reader = stubClass;
        IEnumerable<int> curInt = reader.ExecuteReader<int>("testText", TestFunc);
        foreach (var i in curInt)
        {
            Console.WriteLine(i);
        }
    }

或者如果只是标准方法,你需要使用垫片(我建议使用第一个选项)

    [TestMethod]
    public void ShimFuncTest()
    {
        TestUnitTestClass tutClass = new TestUnitTestClass();
        using (ShimsContext.Create())
        {
            ShimTestUnitTestClass shimClass = new ShimTestUnitTestClass(tutClass);
            shimClass.ExecuteReaderOf1StringFuncOfIDataRecordM0Int32<int>((str, func, timeout) =>
            {
                int[] retVal = {12, 25, 15};
                return retVal;
            });

            IEnumerable<int> curInt = tutClass.ExecuteReader<int>("testText", TestFunc);
            foreach (var i in curInt)
            {
                Console.WriteLine(i);                    
            }
        }
    }

添加对评论的回复
对于普通方法来说,它更容易一些。使用存根,它将类似于

    [TestMethod]
    public void StubRegFuncTest()
    {
        StubITestReader stubClass = new StubITestReader();
        stubClass.ExecuteNonQueryStringInt32 = (str, timeout) => timeout * 2;

        ITestReader reader = stubClass;
        int curInt = reader.ExecuteNonQuery("testText");
        Console.WriteLine(curInt);
        curInt = reader.ExecuteNonQuery("testText", 10);
        Console.WriteLine(curInt);
    }

不太明显的区别是泛型方法包含在括号中,而普通方法只是lambda表达式和代码块。