- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 ASP.Net Core Web API 中为我的一个服务类编写单元测试时,我需要模拟一个 IFormFile
。因此我决定像这样模拟它(使用最小起订量):
fileMock.Setup(x => x.CopyToAsync(It.IsAny<Stream>(), It.IsAny<CancellationToken>()))
.Callback(() =>
{
Console.WriteLine("File Copied");
})
.Returns(Task.CompletedTask);
我想测试的方法愉快地接受了这个模拟,一切看起来都很好,直到我在这里检查了我为测试目的指定的文件位置:
.
这对我来说似乎有点奇怪,因为我预计不会创建任何文件(特别是因为我的回调和返回语句从不接触流)。我试图修改模拟(例如,没有任何回调或立即关闭流)但不幸的是文件仍然被创建。然后我检查了我的文件保存操作的实现:
public async Task<Result> SaveFileToDiskAsync(string filePath, IFormFile file, CancellationToken token)
{
//Checking if values are correct
try
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream, token).ConfigureAwait(false);
return Result.Ok();
}
}
catch (Exception e)
{
//Logging
}
}
这就是我被困的地方。我看不出这种方法有什么问题,特别是因为它似乎在复制文件方面做了正确的事情(它只是在错误的时间这样做)。因此我的问题是:是否有更好的方法来实现模拟或方法来停止 FileCreation?
最佳答案
var stream = new FileStream(filePath, FileMode.Create)
将创建一个文件。
系统与实际的 IO 实现问题紧密耦合。不是可以 mock 的抽象。
抽象文件流访问。
public interface IFileStreamProvider {
Stream Create(string path);
Stream Open(string path);
//...
}
这应该为系统提供所需的灵 active ,使其与实现问题脱钩。
private readonly IFileStreamProvider disk; //populated via constructor injection.
public async Task<Result> SaveFileToDiskAsync(string filePath, IFormFile file, CancellationToken token) {
//Checking if values are correct
try {
using (var stream = disk.Create(filePath)) {
await file.CopyToAsync(stream, token).ConfigureAwait(false);
return Result.Ok();
}
} catch (Exception e) {
//Logging
}
}
并单独测试
//...
var disk = new MemoryStream(); //
var diskMock = new Mock<IFileStreamProvider>();
diskMock
.Setup(_ => _.Create(It.IsAny<string>()))
.Returns(disk);
//...
虽然实际的 IFileStreamProvider.Create
实现将包装 FileStream
的创建。
关于c# - 停止模拟 IFormFile 创建 FileCopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53055711/
在 ASP.Net Core Web API 中为我的一个服务类编写单元测试时,我需要模拟一个 IFormFile。因此我决定像这样模拟它(使用最小起订量): fileMock.Setup(x =>
我正在尝试将所有数据库文件从以前的安装复制到具有新路径名的新安装。问题是安装程序不知道数据库文件的名称,所以我尝试使用通配符。 我尝试使用 TFileStream.Create(),但这是在搜索单个文
是否存在我应该使用以下选项的特定场景,或者它们可以互换吗? 选项1 ... FileSystem.FileCopy... ... 选项2 ... Dim FSO As Object Set FS
我有一个在 Windows 7 上运行的 VB6 程序。它正在复制大量文件,有时 FileCopy 会因访问冲突而失败(每 60 到 500 个文件之间)。 我无法使用单个文件复制它,只有在这种大规模
这里的一位开发人员编写了一些 Java 代码,这些代码使用 Apache FileUtils FileCopy 命令将 csv 从主机服务器 (linux) 复制到文件共享 (EMC NAS)。 共享
这是最简单的程序,但我遇到了这个错误。我将所有信息从一个文件复制到另一个文件。 (坦率地说,我需要从多个文件中复制信息) #include #include void CopyTo(FILE
我是一名优秀的程序员,十分优秀!