Visual Studio: 撤销单元测试测试文件的读取权限
Visual Studio: Revoke reading permission of test file for Unit Testing
我正在使用 C# 开发一个 Visual Studio(社区 2015)项目,该项目从视频文件中读取元数据。因此,我想编写一个 单元测试 来测试程序 是否以正确的方式处理无法访问的文件 。所以我想在单元测试没有读取权限的测试数据中添加一个测试文件。
但是最好的方法是什么? 我在 Visual Studio 中没有找到任何设置权限的选项。我目前唯一的想法是直接在文件的属性中撤销读取权限。通过 Windows 文件资源管理器,因此在 Visual Studio 之外。但是这样我就无法自己读取文件了。另外,这似乎不是正确的方法,我认为应该有更干净的方法直接在 Visual Studio.
中解决这个问题
有什么想法吗?
如果您正在编写单元测试,那么它应该只检查您的代码是否正确编写,而不是检查难以复制或在其他机器上可能不可用的外部问题。所以我认为你应该阅读依赖注入以及如何在你的测试中做模拟依赖。我可以给你一个简单易懂的例子,但请用你的话写出来。
public interface IFileReader
{
string ReadFile( string filePath );
}
public class FileReader : IFileReader
{
public string ReadFile( string filePath )
{
return System.IO.File.ReadAllText( filePath );
}
}
所以假设您有一个 class VideoMetaDataReader,然后在那个 class 中您将接口作为依赖项注入并使用 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 );
}
}
我假设会有一个错误 属性 会 return 遇到错误,但这取决于你想怎么做(我没想太多)。
无论如何,重点是不要测试您的代码未涵盖的内容。您的代码需要做的是在出现异常时显示一条好消息,如果您模拟接口(这意味着不要调用实际实现,而是执行我在此测试中想要执行的操作),则可以执行此操作,然后检查您的代码是否可以处理。顺便说一句,我使用 nunit 和 moq 进行测试和模拟。
我正在使用 C# 开发一个 Visual Studio(社区 2015)项目,该项目从视频文件中读取元数据。因此,我想编写一个 单元测试 来测试程序 是否以正确的方式处理无法访问的文件 。所以我想在单元测试没有读取权限的测试数据中添加一个测试文件。
但是最好的方法是什么? 我在 Visual Studio 中没有找到任何设置权限的选项。我目前唯一的想法是直接在文件的属性中撤销读取权限。通过 Windows 文件资源管理器,因此在 Visual Studio 之外。但是这样我就无法自己读取文件了。另外,这似乎不是正确的方法,我认为应该有更干净的方法直接在 Visual Studio.
中解决这个问题有什么想法吗?
如果您正在编写单元测试,那么它应该只检查您的代码是否正确编写,而不是检查难以复制或在其他机器上可能不可用的外部问题。所以我认为你应该阅读依赖注入以及如何在你的测试中做模拟依赖。我可以给你一个简单易懂的例子,但请用你的话写出来。
public interface IFileReader
{
string ReadFile( string filePath );
}
public class FileReader : IFileReader
{
public string ReadFile( string filePath )
{
return System.IO.File.ReadAllText( filePath );
}
}
所以假设您有一个 class VideoMetaDataReader,然后在那个 class 中您将接口作为依赖项注入并使用 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 );
}
}
我假设会有一个错误 属性 会 return 遇到错误,但这取决于你想怎么做(我没想太多)。
无论如何,重点是不要测试您的代码未涵盖的内容。您的代码需要做的是在出现异常时显示一条好消息,如果您模拟接口(这意味着不要调用实际实现,而是执行我在此测试中想要执行的操作),则可以执行此操作,然后检查您的代码是否可以处理。顺便说一句,我使用 nunit 和 moq 进行测试和模拟。