0

我已经编写了一个将文件上传到云存储的代码。该代码包含一个 post 方法,该方法采用以下格式的文件:multipart/form-data 并将其上传到云。那么我怎样才能写一个相同的测试用例呢?具体来说,如何模拟该帖子文件。

使用的格式是 formfile 代码在 asp.net core 3.1 中使用 c#。

4

2 回答 2

2

我建议在这里使用抽象,你应该创建一个像下面这样的接口 -

Public Interface IFileSystem{
 bool uploadFile(FileStrem fileContent);
}

然后在上述类的派生中编写您的云特定实现,然后

在您的业务逻辑中使用该实现,因此当您为业务逻辑编写测试时,您可以模拟文件系统。

于 2020-01-08T07:25:51.733 回答
2

在我工作的公司中,“Mocking”从未真正看得太好。

通常编写测试实现效果更好:

public interface IUploader
{
    IResult Upload(string filePath);
}

public sealed class FileUploader
{
    IResult Upload(string filePath) { ... } // method is implemented as expected
}

public sealed class TestUploader //this is placed in a specific folder for test implementations
{
    public IResult ExpectedResult { get; set; } = Result.Success();
    IResult Upload(string filePath) => ExpectedResult;
}

要将它与您的班级联系起来,请检查Humble Object Design Pattern。它解释了如何从明显不可测试的类中提取可测试的逻辑。

void UploadToCloud(string filePath) 
{
    ...
    Uploader.Upload(filePath); // real implementation in production code, test implementation during unit testing.
    ...
}

出于多种原因,我更喜欢这种方式:

  • 生产代码的更改也迫使您更改测试实现。使用 Mock,您可能不会注意到您的测试已经过时。
  • 测试实现为您提供更多自由(即您可以在测试的初始化部分将测试结果传递给测试实现,以检查边缘情况)。
  • 它比模拟更干净,其他开发人员可以更好地理解正在发生的事情。代码越整洁,就越容易保持干净。
  • 您仍然有一些来自界面的约束。有时,Mock 类会变成看起来不再像原来的类的巨大怪物。

注意:如果要测试接收部分,可以使用相同的策略。您的测试实施将包含文件的预期内容,以测试云响应。

于 2020-01-08T08:44:54.190 回答