c# - 单元测试添加到 Zip/从 Zip 中提取

标签 c# unit-testing mocking mstest stubbing

我有以下代码用于添加到 Zip 中/从 Zip 中提取。我正在尝试重构它以使其可以测试。有人可以提供有关我如何做到这一点的指示吗?
另外:我使用 Moq 作为我的模拟框架和 MSTest 作为我的单元测试工具

private const long BufferSize = 4096;

public static void ExtractZip(string zipFilename, string folder) {
  using (var zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) {
    foreach (var part in zip.GetParts()) {
      using (var reader = new StreamReader(part.GetStream(FileMode.Open, FileAccess.Read))) {
        using (var writer = new FileStream(folder + "\\" + Path.GetFileName(part.Uri.OriginalString),
                                           FileMode.Create, FileAccess.Write)) {
          var buffer = System.Text.Encoding.UTF8.GetBytes(reader.ReadToEnd());
          writer.Write(buffer, 0, buffer.Length);
        }
      }
    }
  }
}

public static void AddFileToZip(string zipFilename, string fileToAdd) {
  using (var zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) {
    var destFilename = ".\\" + Path.GetFileName(fileToAdd);
    var uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
    if (zip.PartExists(uri)) {
      zip.DeletePart(uri);
    }
    var part = zip.CreatePart(uri, "", CompressionOption.Normal);
    using (var fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read)) {
      using (var dest = part.GetStream()) {
        CopyStream(fileStream, dest);
      }
    }
  }
}

提前致谢。

最佳答案

我将创建这两个静态方法(ExtractZip 和 AddFileToZip)实例方法,并将其放入接口(interface)中:

public interface IZipper
{
  void ExtractZip(string zipFilename, string folder);
  void AddFileToZip(string zipFilename, string fileToAdd);
}

public class Zipper : IZipper
{
  public void ExtractZip(string zipFilename, string folder)
  { 
    //...
  }

  void AddFileToZip(string zipFilename, string fileToAdd)
  {
    //...
  }
}


// client code
class Foo
{
  private IZipper myZipper;
  // gets an instance of the zipper (injection), but implements only 
  // against the interface. Allows mocks on the IZipper interface.
  public Foo(IZipper zipper)
  {
    myZipper = zipper;
  }

}

客户端代码现在很容易测试。

zipper 类呢?
  • 考虑是否值得测试。
  • 在我们的项目中,我们区分了单元测试(隔离)和集成测试,其中可以使用数据库或文件系统。您可以将其声明为“文件系统集成测试”。当然,只允许使用测试目标文件夹。这不应该有任何问题。
  • 考虑将文件操作移出,并且只使用流。然后,您可以轻松地测试内存流上的压缩。文件操作仍然需要在某个地方并且未经测试。
  • 关于c# - 单元测试添加到 Zip/从 Zip 中提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1096919/

    相关文章:

    c# - 如何禁用 TabIndex?

    c# - 无法访问我的扩展方法

    c# - 从 GridView TemplateField 调用 Javascript

    javascript - 我如何使用自己的 JavaScript 库处理 "think in QUnit"?

    ruby - 接收 block 作为参数的模拟方法

    javascript - 同时模拟 firebase 作为对象和函数的身份验证?

    c# - 如何从 SQLServer 的几何数据中获取 GeoJSON 格式?

    Python如何在另一个函数中模拟一个函数

    c# - 验证是否使用 moq 调用 linq 扩展方法

    mocking - Serilog ILogger.ForContext 在 XUnit Mock 中抛出 NullReferenceException