我正在從一個文件寫入另一個文件,並且在我的測試中創建了一個Assert語句來檢查新文件是否等於原始文件,但不確定最佳方式去做吧。我嘗試Assert.Equals
,但它返回失敗,即使我身體檢查兩個文件,他們是完全一樣的。斷言語句比較兩個文件是否相等
Assert.IsTrue(File.Equals(downloadfile, created), "Files do not match");
我正在從一個文件寫入另一個文件,並且在我的測試中創建了一個Assert語句來檢查新文件是否等於原始文件,但不確定最佳方式去做吧。我嘗試Assert.Equals
,但它返回失敗,即使我身體檢查兩個文件,他們是完全一樣的。斷言語句比較兩個文件是否相等
Assert.IsTrue(File.Equals(downloadfile, created), "Files do not match");
創建文件的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);
}
https://stackoverflow.com/a/7931353/2551839
這樣的回答顯示瞭如何比較文件,使用該功能您斷言
我重構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);
}
}
}
和使用中測試以下內容:
using Test.Helpers;
[Test]
public void CompareTwoFiles()
{
FileAssert.AreEqual(@"path_to_file1", @"path_to_file2");
}
十六進制轉換應該使用2個字符 – bmm6o