如何在微软假单元测试中打破对StreamReader的readLine()方法的依赖?

时间:2016-02-27 15:51:49

标签: unit-testing readline microsoft-fakes

以下是我要测试的方法之一的代码:

    using (var sr = new StreamReader(myFile))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                if (line.Equals("completed"))
                {
                    continue; //here it is getting called infinite times
                }

                if(line.Equals("processed"))
                {
                    break;
                }
            }
        }

在我的测试方法中,我在shim的帮助下编写了下面的代码:

            ShimStreamReader.ConstructorString = delegate (StreamReader @this, string @string)
            {
                var reader = new ShimStreamReader(@this);
                reader.ReadLine = () =>
                {
                    return "completed";
                };
            };

现在我不想传递文件。相反,我想传递字符流或字符串。 上面的测试代码正在调用并按预期打破新StreamReader(myFile)的依赖关系并进入while循环。 一旦它在while循环中进入,sr.ReadLine()就会一直返回“completed”。所以我被困在这里。我将如何停在这里或如何编写输入字符串,以便在第一次调用返回完成后,在sr.ReadLine()的第二次调用中它应该返回null,然后打破循环?

1 个答案:

答案 0 :(得分:0)

你更喜欢这里的一般编码问题,而不是假货。您需要做的就是添加一个标志,并在准备结束输入时进行设置。这是我用的代码

    private bool _lineSent = false;

    [TestMethod]
    public void ReaderTest()
    {
        using (ShimsContext.Create())
        {
            ShimStreamReader.ConstructorString = (reader, s) =>
            {
                ShimStreamReader shimReader = new ShimStreamReader(reader);
                shimReader.ReadLine = () =>
                {
                    if (!_lineSent)
                    {
                        _lineSent = true;
                        return "completed";
                    }
                    else
                    {
                        return null;
                    }
                };
            };

            ClassToTest testInstance = new ClassToTest();
            testInstance.ReadStream();
        }
    }

顺便说一句,根据您的级别和您要学习的内容,您可能希望查看依赖注入和使用存根而不是填充。垫片很方便,但是对于新的开发和代码,你可以尝试使用存根。