首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止模仿IFormFile创建FileCopy

停止模仿IFormFile创建FileCopy
EN

Stack Overflow用户
提问于 2018-10-30 00:23:40
回答 1查看 501关注 0票数 1

在编写ASP.Net核心Web中的一个服务类的单元测试时,我需要模拟一个IFormFile。因此,我决定这样模拟它(使用moq):

代码语言:javascript
复制
fileMock.Setup(x => x.CopyToAsync(It.IsAny<Stream>(), It.IsAny<CancellationToken>()))
.Callback(() =>
{
    Console.WriteLine("File Copied");
})
.Returns(Task.CompletedTask);

我想要测试的方法很高兴地接受这个模拟,在这里我检查了为测试目的指定的文件位置之前,所有这些看起来都很好:

这对我来说有点奇怪,因为我期望不会创建任何文件(特别是因为我的回调和返回语句从未触及流)。我试图修改模拟(例如,没有任何回调或立即关闭Stream),但是文件仍然没有创建。然后,我检查了文件保存操作的实现:

代码语言:javascript
复制
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的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-30 00:47:49

代码语言:javascript
复制
var stream = new FileStream(filePath, FileMode.Create) 

创建一个文件。

系统与实际IO实现的关注点紧密耦合。不是一个可以被嘲笑的抽象。

抽象文件流访问。

代码语言:javascript
复制
public interface IFileStreamProvider {
    Stream Create(string path);
    Stream Open(string path);
    //...
}

这应该使系统具有与实现问题脱钩的灵活性。

代码语言:javascript
复制
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
    }
}

在隔离状态下测试

代码语言:javascript
复制
//...

var disk = new MemoryStream(); //
var diskMock = new Mock<IFileStreamProvider>();
diskMock
    .Setup(_ => _.Create(It.IsAny<string>()))
    .Returns(disk);

//...

而实际的IFileStreamProvider.Create实现将包装创建一个FileStream

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53055711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档