我有以下方法
public void ValidateAccessToFile(string filePath, List<String> errorMessageList)
{
try
{
using (FileStream fs = (FileStream)_iomgr.OpenFile(filePath))
{
if (fs.CanRead && fs.CanWrite) { }
else
{
errorMessageList.Add("Can not read/write to the specified file.");
}
}
}
catch (Exception e)
{
errorMessageList.Add(e.Message);
}
}
和id喜欢测试它是否写入“errorMessageList”,如果其中一个属性,CanRead或CanWrite为false。这可能吗?
[Test]
public void ValidateAccessToFile_CanReadWriteToFile_NoErrorAddedToErrorListMessage()
{
Mock<IIOManager> mock = new Mock<IIOManager>();
mock.Setup(x => x.OpenFile(It.IsAny<string>())).Returns(new MemoryStream());
List<String> errorMessageList = new List<string>();
VerificationManager testObject = new VerificationManager(mock.Object);
testObject.ValidateAccessToFile("Random.txt", errorMessageList);
Assert.AreEqual(errorMessageList.Count, 0);
}
如何为New MemoryStream属性赋值? 谢谢你的时间。
修改
以下是我写的最终测试方法。
public void ValidateAccessToFile_CanReadWriteToFile_NoErrorAddedToErrorListMessage()
{
bool _isReadOnly = true;
List<String> errorMessageList = new List<string>();
Mock<IIOManager> mock = new Mock<IIOManager>();
mock
.Setup(x => x.IsReadOnly(It.IsAny<string>()))
.Returns(_isReadOnly);
VerificationManager testObject = new VerificationManager(mock.Object);
testObject.ValidateAccessToFile(It.IsAny<string>(), errorMessageList);
Assert.AreEqual(errorMessageList.Count, 0);
}
答案 0 :(得分:4)
只是不要返回MemoryStream
,而是正确配置MemoryStream
的模拟。
var m = new Mock<MemoryStream>();
m.Setup(x=>x.CanRead).Returns(false);
m.Setup(x=>x.CanWrite).Returns(false);
mock.Setup(x => x.OpenFile(It.IsAny<string>())).Returns(m.Object);
答案 1 :(得分:1)
根据MemoryStream.CanRead
的{{3}},只要流已打开,该属性就会始终返回true
。 (CanWrite
不太清楚,但我相信它是一样的。)
因此,您可以在返回之前关闭该流,或者您可以使用适当的覆盖模拟Stream
。
顺便说一句,我不确定MemoryStream
是否可以投放到FileStream
。请参阅documentation。
答案 2 :(得分:0)
您可以使用
public class BadFileStream : FileStream
{
public BadFileStream(string path, FileMode mode) : base(path, mode)
{
}
public override bool CanWrite
{
get
{
return false;
}
}
public override bool CanRead
{
get
{
return false;
}
}
}
并更改模拟
mock.Setup(x => x.OpenFile(It.IsAny<string>())).Returns(new BadFileStream(file, FileMode.Open));