代码之家  ›  专栏  ›  技术社区  ›  arne.z

Visual Studio:撤消单元测试测试文件的读取权限

  •  0
  • arne.z  · 技术社区  · 10 年前

    我正在用C#编写一个Visual Studio(Community 2015)项目,该项目从视频文件中读取元数据。因此,我想写一篇 单元测试 测试程序是否 处理无法访问的文件 正确的方式。因此,我想向单元测试没有读取权限的测试数据中添加一个测试文件。

    但最好的方法是什么? 我在Visual Studio中找不到任何设置权限的选项。目前我唯一的想法是直接撤销文件属性中的读取权限。通过Windows文件资源管理器,从而在Visual Studio之外。但那样我自己就无法读取文件了。而且,这似乎不是正确的方法,我认为应该有一种更干净的方法直接在VisualStudio中解决这个问题。

    有什么想法吗?

    1 回复  |  直到 10 年前
        1
  •  1
  •   adeel41    10 年前

    如果您正在编写一个单元测试,那么它应该只检查您的代码是否编写正确,而不是关于难以复制或可能在其他机器上不可用的外部问题。所以我认为您应该阅读依赖注入以及如何在测试中进行模拟依赖。我可以给你一个容易理解的例子,但请用你的话写出来。

    public interface IFileReader
    {
        string ReadFile( string filePath );
    }
    
    
    public class FileReader : IFileReader
    {
        public string ReadFile( string filePath )
        {
            return System.IO.File.ReadAllText( filePath );
        }
    }
    

    因此,假设您有一个类VideoMetaDataReader,那么在该类中,您将注入接口作为依赖项,并使用ReadFile方法进行读取。然后在你的测试中

    [TestFixture]
        public class FileReaderTests
        {
            [Test]
            public void ShouldDisplayANiceMessage_WhenFileIsInaccessible()
            {
                var moq = new Moq.Mock<IFileReader>();
                moq
                    .Setup( x => x.ReadFile( Moq.It.IsAny<string>() ) )
                    .Throws<Exception>();
    
                var metaDataReader = new MetaDataReader( moq.Object );
                metaDataReader.ReadVideoFile( "video.mp4" );
                Assert.AreEqual( 1, meaDataReader.Errors.Count );    
            }
        }
    

    我假设会有一个errors属性,它将返回遇到的错误,但这取决于你想如何做(我没有考虑太多)。

    无论如何,重点是不要测试代码没有涵盖的内容。您的代码需要做的是,如果出现异常,显示一条漂亮的消息,如果您模拟接口,您可以这样做(这意味着不要调用实际的实现,而是执行我希望在本测试中执行的操作),然后检查您的代码是否可以处理这一点。顺便说一句,我用nunit和moq进行测试和嘲讽。

    推荐文章