2013-07-23 107 views
1

我正在從一個文件寫入另一個文件,並且在我的測試中創建了一個Assert語句來檢查新文件是否等於原始文件,但不確定最佳方式去做吧。我嘗試Assert.Equals,但它返回失敗,即使我身體檢查兩個文件,他們是完全一樣的。斷言語句比較兩個文件是否相等

Assert.IsTrue(File.Equals(downloadfile, created), "Files do not match"); 

回答

3

創建文件的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); 
} 
+0

十六進制轉換應該使用2個字符 – bmm6o

4

我重構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"); 
}