1

私は次の方法を持っています

    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);
        }
    }

CanRead または CanWrite のいずれかのプロパティが false の場合、「errorMessageList」に書き込むことをテストしたいと思います。これは可能ですか?

    [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);
    }
4

3 に答える 3

4

を返すのMemoryStreamではなく、適切に構成された a のモックを返します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);
于 2012-08-08T14:46:34.830 に答える
1

のドキュメントによると、ストリームが開いている限りMemoryStream.CanRead、プロパティは常に返されます。trueCanWriteあまり明確ではありませんが、同じだと思います。)

したがって、ストリームを返す前にストリームを閉じるかStream、適切なオーバーライドを使用してストリームをモックすることができます。

ちなみに、にMemoryStreamキャストできるかどうかはわかりませんFileStreamこの投稿を参照してください。

于 2012-08-08T14:47:23.240 に答える
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));
于 2012-08-08T14:44:46.440 に答える