以下是我要测试的方法之一的代码:
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,然后打破循环?
答案 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();
}
}
顺便说一句,根据您的级别和您要学习的内容,您可能希望查看依赖注入和使用存根而不是填充。垫片很方便,但是对于新的开发和代码,你可以尝试使用存根。