如何使用 System.IO.Abstraction 模拟 FileStream?

2024-03-01

我正在尝试使用系统.IO.抽象 https://github.com/System-IO-Abstractions/System.IO.Abstractions项目与 System.IO.Abstraction.TestingHelpers 一起模拟FileStream.

这是使用我要测试的文件流的代码:

private readonly IFileSystem _fileSystem;

public void ExtractImageAndSaveToDisk(IXLPicture xlPicture, string filePath)
{
    using (MemoryStream ms = new MemoryStream())
    {
        xlPicture.ImageStream.CopyTo(ms);

        using (FileStream fs = (FileStream)_fileSystem.FileStream.Create(filePath, FileMode.Create))
        {
            ms.CopyTo(fs);
            fs.Flush();
            fs.Close(); 
        }
    }
}

这就是我设置测试的方式:

[TestMethod]
public void CheckFileIsSavedToDisk()
{
    // Arrange
    var mockFileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
    {
        { @"c:\Test\Images\", new MockDirectoryData() },
    });

    var xlPicture = GetXLPicture();
    var filePath = @"c:\Test\Images\myimage.jpeg";

    var sut = new CostSheetImageExtractor(mockFileSystem);

    // Act
    sut.ExtractImagesAndSaveToDisk(xlPicture, filePath);
}

运行我得到异常:

System.InvalidCastException: Unable to cast object of type 'System.IO.Abstractions.TestingHelpers.MockFileStream' to type 'System.IO.FileStream'.

on the using (FileStream fs = ... line.

第一个想法是我需要改变FileStream fs使用真实对象和模拟对象共享的接口,但据我所知,没有IFileStream接口FileStream and MockFileStream分享,所以我猜我做的完全错误? 实际上有没有办法用 System.IO.Abstraction 测试这段代码?

This 现有答案 https://stackoverflow.com/a/44820425/1879019似乎表明这应该是可能的,我也尝试这样做,但得到了相同的结果。


到目前为止,不嘲笑文件系统是最好的选择,因为克里斯·F·卡罗尔答案说,但如果你真的想这样做,你的问题几乎包含了答案。

正如你所说,不存在这样的事情IFileStream界面,但如果你看一下的定义FileStream https://learn.microsoft.com/en-us/dotnet/api/system.io.filestream?view=netframework-4.7.2你会发现它继承了抽象类Stream,这是所有类型的流数据源的通用基类。假货MockFileStream也应该继承那里。

因此,尝试更改代码以使用抽象类:

using (Stream fs = (Stream)_fileSystem.FileStream.Create(filePath, FileMode.Create))
{
    ms.CopyTo(fs);
    fs.Flush();
    fs.Close(); 
}

它仍然保留所有基本方法,并且您的代码仅使用基本方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 System.IO.Abstraction 模拟 FileStream? 的相关文章

  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 快速排序 - 使其稳定的条件

    如果排序算法保留具有 equals 键的任意两个元素的相对顺序 则该算法是稳定的 快速排序在什么条件下稳定 当没有项被传递时 快速排序是稳定的 除非它具有较小的键 还有哪些条件可以使其稳定 嗯 使用 O N 空间而不是就地不稳定实现使用的
  • 为什么函数体内定义的内置类型的未初始化对象具有未定义的值?

    问题 为什么定义内置类型的未初始化对象inside函数体具有未定义的值 而内置类型的对象已定义outside任何函数的初始化为0 or 举个例子 include
  • 如何将 Makefile 中的警告视为错误?

    是否可以将警告视为 Makefile 中的错误 从而在 Makefile 继续之前退出 此外 是否可以过滤掉哪个警告会产生错误 我的用例 我想使用 warn undefined variables与此结合 当变量未定义时 Makefile
  • 在 Bluehost 上部署 Ruby on Rails

    这里有人知道如何在 Bluehost 上部署 Ruby 应用程序吗 我对此有很大的问题 每次我将文件放入域名指向的文件夹中时 当我尝试访问该网站时 它总是会出现 403 错误 太痛苦了 这指示 https my bluehost com c
  • 在处理发生时动态刷新 JTextArea?

    我正在尝试创建一个非常简单的 Swing UI 当处理在后台进行时 该 UI 通过 JTextArea 将信息记录到屏幕上 当用户单击按钮时 我希望每次调用 textArea append someString n 立即显示在 UI 中 目
  • python 2.x 中的 textinput() 等效项

    我需要在 python 的海龟中接受用户的信息 但是 turtle textinput 函数仅适用于 3 x 及更高版本 我可以在 2 X 版本中使用替代方案吗 这是什么textinput实际上是 import tkSimpleDialog
  • Jetty - 设置系统属性[重复]

    这个问题在这里已经有答案了 我在 Jetty 上运行 webapp 应用程序的配置来自运行 Jetty 的同一服务器上的文件 在应用程序内部 我依靠系统属性来获取文件的路径 以便我可以解析它 例如 final String loc Syst
  • 如何在任何 Web 服务器(Apache 或 Mongrel 或任何其他服务器)中运行简单的 ruby​​ 脚本

    我觉得很有趣的是 当我搜索与 Ruby 相关的内容时 所有与 Ruby on Rails 相关的结果都会弹出 那么没人再使用原始红宝石了吗 然而 我是红宝石新手 今天早上我只是想在网络服务器中运行一个简单的 hello world ruby
  • 仅当 varchar 包含有效日期时,如何将其转换为日期?

    我正在寻找有关 SQL Server Management Studio 的我认为非常有用的信息 我有一个带有 type 列的表varchar存储日期 数字和字符串 这些日期以以下格式存储 dd mm aaaa 我有一个搜索匹配行的查询 一
  • 使用 Bash 脚本构建 SQL 更新语句

    对于最近的项目 我需要循环遍历 3 列的 csv ignore csv 行 acctnum errcode date 按此顺序 列命名在这里并不重要 它只是为了上下文 并使用这些变量来构建 SQL 语句 CSV 可能有 500 行 也可能有
  • android twitter outh教程回调问题

    尝试以下教程 http www androidsdkforum com android sdk development 3 oauth twitter html http www androidsdkforum com android sd
  • 如何将 Windows 窗体窗体的大小调整为小于 132x38? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 当我将无边框表单调整为较小的宽度和高
  • 填充滚动 Flex 容器的 100% 宽度

    我有一个水平滚动元素 overflow x scroll 与包含弹性项目的弹性容器 我正在尝试将背景应用于弹性容器 但正如您在下面的示例中看到的 尝试向左 向右滚动 背景仅应用于视口的可见部分 橙色 有没有什么方法可以将其扩展到全宽 而不必
  • 如何在创建多维数组后立即为其分配多个值 - 在 C 中?

    我正在用 C 进行编程 想知道是否可以一次将多个值分配给多维数组 我尝试过一些技术 但都失败了 我不感兴趣循环遍历数组来分配值 我想要快速的方式为数组中的所有索引分配新值 我正在使用的数组 ary 4 4 来自另一个的 memcpy 将覆盖
  • 有人在 php 5.6 上测试过 Codeigniter 2.2 吗?

    只是想知道 有人在 PHP 5 6 上测试过 CodeIgniter 应用程序吗 我们正在将服务器从 5 3 3 升级到 5 6 当前运行的是 CodeIgniter 2 2 这样可以吗 如果是 如果您发布反馈意见 我将非常感激您遇到了哪些
  • 无法访问 wp-admin

    我意识到这个问题过去曾出现过 但我一直无法找到解决我的问题的方法 我的 wp admin 在我的本地主机上工作正常 但是 当我迁移到实时服务器时 我无法再访问它 如果我确实访问 mysite wp admin 则会收到 404 错误 我尝试
  • cassandra 中 TTL 的最大值

    我们可以分配给 TTL 的最大值是多少 在 cassandra 的 java 驱动程序中 TTL 设置为 int 这是否意味着它仅限于 Integer MAX 2 147 483 647 秒 最大 TTL 实际上是 20 年 从org ap
  • as.Date() 不考虑 POSIXct 时区

    好吧 这里有一个微妙的 怪癖 在 r as Date 函数中从带有时区的 POSIXct 转换而来 我想知道这是否是一个错误 gt as POSIXct 2013 03 29 tz Europe London 1 2013 03 29 GM
  • 两个音频信号之间的时间延迟估计

    我有两个不同麦克风对同一信号进行的两段音频录音 例如 以 WAV 格式 但其中之一的录制有延迟 例如几秒钟 在某种波形查看器中查看这些信号时 很容易通过视觉识别这种延迟 即只需发现每个信号中的第一个可见峰值并确保它们具有相同的形状 sour
  • 如何使用 System.IO.Abstraction 模拟 FileStream?

    我正在尝试使用系统 IO 抽象 https github com System IO Abstractions System IO Abstractions项目与 System IO Abstraction TestingHelpers 一