2

私は次のテスト方法を使用しており、2つのテストを作成しました。例外がスローされるシナリオをテストし、どちらが正しいか疑問に思っています。

namespace JimBob.CsvImporter.Entity
{

    public interface IIOManager
    {
        Stream OpenFile(string path);

        TextReader ReturnReader(string path);
    }


    public class IOManager : IIOManager
    {
        public Stream OpenFile(string path)
        {
            return File.Open(path, FileMode.Open);
        }

        public TextReader ReturnReader(string filePath)
        {
            return new StreamReader(filePath);
        }
    }


public class EntityVerification
{

    private IIOManager _iomgr;

    public EntityVerification(IIOManager ioManager)
    {
        this._iomgr = ioManager;
    }

    ...

    /// <summary>
    /// Ensures user can open file.
    /// </summary>
    /// <param name="errorMessageList">A running list of all errors encountered.</param>
    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);
        }
    }

テスト:

    [Test]
    public void ValidateAccessToFile_CanReadWriteToFile_ThrowException()
    {
        List<String> errorMessageList = new List<string>();
        StubService stub = new StubService();
        EntityVerification testObject = new EntityVerification(stub);
        testObject.ValidateAccessToFile("ergesrg", errorMessageList);
        Assert.AreEqual(errorMessageList.Count, 0);
    }

    [Test]
    public void ValidateAccessToFile_CanReadWriteToFile_ThrowsException()
    {
        Mock<IIOManager> mock = new Mock<IIOManager>();
        mock.Setup(x => x.ReturnReader(It.IsAny<string>())).Throws(new InvalidOperation("throw baby."));
        EntityVerification testObject = new EntityVerification(mock.Object);
        List<String> errorMessageList = new List<string>();
        testObject.ValidateAccessToFile("blabla.txt", errorMessageList);
        Assert.AreEqual(errorMessageList.Count, 0);
    }



    public class StubService : IIOManager
    {
        public Exception ex;
        public Stream OpenFile(String path)
        {
            throw ex;
        }
    }

どちらのテストも、テストへのローカル変数(この場合はerrorMessageList)に何かが含まれていることを確認するだけなので、どちらを使用すべきかわかりません。

コメントをいただければ幸いです。

ありがとう

4

2 に答える 2

2

まず、リストにエラーメッセージを追加しているかどうかを確認する必要がありますか?

Assert.AreEqual(errorMessageList.Count, 1);

次に、2番目のテストは少し冗長ではなく、読みやすくなっていますが(別のクラスを実装する必要がないため)、問題ではありません。2つのテストは、どちらも同じ目標を達成するための有効な方法です。いずれかを選択して、次の機能に進んでください...

于 2012-07-27T19:01:40.180 に答える
1

2番目のテストは良く見えます。IIOManager最初のテスト(更新スタブ)を維持する必要がある他のメソッドがあると思いますが、2番目のテストでは何もしません。

についてIOManagerFileSystem-より適切なクラス名に見えます

于 2012-07-27T20:03:33.560 に答える