声明语句以比较两个文件是否相等

Mas*_*yah 1 c# asp.net-mvc unit-testing assert

我正在从一个文件写入另一个文件,并在测试中创建了一个Assert语句,以检查新文件是否等于原始文件,但不确定哪种最佳方法。我尝试过,Assert.Equals但是即使我物理检查了两个文件,它们也都返回失败,并且它们完全相同。

 Assert.IsTrue(File.Equals(downloadfile, created), "Files do not match");
Run Code Online (Sandbox Code Playgroud)

Jed*_*iah 5

创建文件的MD5或SHA哈希,然后进行比较。

public string GetFileHash(string filename)
{
    var hash = new SHA1Managed();
    var clearBytes = File.ReadAllBytes(filename);
    var hashedBytes = hash.ComputeHash(clearBytes);
    return ConvertBytesToHex(hashedBytes);
}

public string ConvertBytesToHex(byte[] bytes)
{
    var sb = new StringBuilder();

    for(var i=0; i<bytes.Length; i++)
    {
        sb.Append(bytes[i].ToString("x"));
    }
    return sb.ToString();
}

[Test]
public void CompareTwoFiles()
{
    const string originalFile = @"path_to_file";
    const string copiedFile = @"path_to_file";

    var originalHash = GetFileHash(originalFile);
    var copiedHash = GetFileHash(copiedFile);

    Assert.AreEqual(copiedHash, originalHash);
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*bes 5

我重构了 ia.solano 的答案并创建了 FileAssert 类

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Test.Helpers
{
    public static class FileAssert
    {
        static string GetFileHash(string filename)
        {
            Assert.IsTrue(File.Exists(filename));

            using (var hash = new SHA1Managed())
            {
                var clearBytes = File.ReadAllBytes(filename);
                var hashedBytes = hash.ComputeHash(clearBytes);
                return ConvertBytesToHex(hashedBytes);
            }
        }

        static string ConvertBytesToHex(byte[] bytes)
        {
            var sb = new StringBuilder();

            for (var i = 0; i < bytes.Length; i++)
            {
                sb.Append(bytes[i].ToString("x"));
            }
            return sb.ToString();
        }

        public static void AreEqual(string filename1, string filename2)
        {
            string hash1 = GetFileHash(filename1);
            string hash2 = GetFileHash(filename2);

            Assert.AreEqual(hash1, hash2);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试中的用法如下:

using Test.Helpers;

[Test]
public void CompareTwoFiles()
{   
    FileAssert.AreEqual(@"path_to_file1", @"path_to_file2");
}
Run Code Online (Sandbox Code Playgroud)