2015-04-20 11 views
6
public void NumericListCanBeSorted() 
{ 
    var sorted = sort.SortNumbers(nums); 
    Assert.AreEqual(sorted, nums); 
} 

public List<int> SortNumbers(List<int> nums) 
    { 
     List<int> sortedList = new List<int>(); 

     for (int i = 0; i < nums.Count(); i++) 
     { 
      for (int j = i + 1; j < nums.Count; j++) 
      { 
       if (nums[i] > nums[j]) 
       { 
        //Swapping values 
        nums[i] = nums[i] + nums[j]; 
        nums[j] = nums[i] - nums[j]; 
        nums[i] = nums[i] - nums[j]; 
       } 
      } 
      sortedList.Add(nums[i]); 
     } 
     return sortedList; 
    } 

Result Message: Assert.AreEqual failed. 
Expected:  <System.Collections.Generic.List`1[System.Int32]>. 
     Actual :<System.Collections.Generic.List`1[System.Int32]>. 

Các kiểu dữ liệu của dự kiến ​​và thực tế giống nhau. Vẫn thử nghiệm thất bại. Không thể hiểu tại sao? Ai đó có thể xin vui lòng giúp tôi biết lý do. Hơn nữa, nó hoạt động cho các chức năng sau đây.CollectionAssert.AreEquivalent vs Assert.Equals()

public List<int> SortNumbers(List<int> nums) 
    { 
     List<int> sortedList = new List<int>(); 
     for (int i = 0; i < nums.Count(); i++) 
     { 
      for (int j = i + 1; j < nums.Count; j++) 
      { 
       if (nums[i] > nums[j]) 
       { 
        //Swapping values 
        nums[i] = nums[i] + nums[j]; 
        nums[j] = nums[i] - nums[j]; 
        nums[i] = nums[i] - nums[j]; 
       } 
      } 
     } 
     sortedList = nums; 
     return sortedList; 
    } 

Trả lời

17

So sánh loại tham chiếu.

Thử sử dụng CollectionAssert.AreEqual hoặc CollectionAssert.AreEquivalent.

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.areequivalent.aspx

Đây là những gì sẽ xảy ra:

Bạn sử dụng Assert.AreEqual(List<int>, List<int>), trong đó, CLR/NET đi vào và nói, "là tài liệu tham khảo của Danh sách 1 giống như Danh sách 2?" Kết quả là không, do đó CLR/.NET gửi cho bạn một đọc sai.

CollectionAssert liệt kê các mảng (danh sách những gì là nội bộ) và xác định xem chúng có cùng các mục hay không. CollectionAssert.AreEqual kiểm tra xem chúng có cùng các mục theo cùng một thứ tự hay không. CollectionAssert.AreEquivalent kiểm tra xem chúng có cùng các mục hay không, theo bất kỳ thứ tự nào.

BẤT CỨ mảng/Danh sách/từ điển PHẢI sử dụng CollectionAssert để so sánh như vậy.

Ví dụ:

List<int> l1 = new List<int>(); 
List<int> l2 = l1; 
Assert.AreEqual(l1, l2); 

này sẽ cho kết quả đúng, do l2 đã được thiết lập để tham chiếu giống như l1.

Tuy nhiên,

List<int> l1 = new List<int>(); 
List<int> l2 = new List<int>(); 
Assert.AreEqual(l1, l2); 

này sẽ dẫn đến một sai do l2 đã được thực hiện một MỚI tham chiếu đến một đối tượngMỚI. Trong khi sử dụng

CollectionAssert.AreEqual(l1, l2); 

Sẽ cho kết quả trong một đúng trong cả hai tình huống trên. Điều này là do CLR/.NET thực sự đi qua danh sách và kiểm kê nó, về cơ bản.

Chỉnh sửa khác, vì tôi muốn làm rõ thêm: bạn cũng có thể sử dụng CollectionAssert.AreEquivalent, sẽ không đảm bảo các mục theo cùng thứ tự, nhưng chỉ đơn giản đảm bảo rằng các mảng/Danh sách/Từ điển có cùng số lượng của cùng một mục . Tức là .:

1,2,3,3,2,1 
1,3,2,2,3,1 

này sẽ dẫn đến đúng với CollectionAssert.AreEquivalent, nhưng sai với CollectionAssert.AreEqual.

+0

Bạn có thể giải thích chi tiết một chút không. Tôi đang tìm AreEqual. –

+0

@SravanKumar sortList! = Nums do đó nó không thành công - bạn cần phải so sánh mục theo mục, không phải là hai đối tượng mảng.Gỡ lỗi và thử kiểm tra nếu sắp xếpList == nums trong cửa sổ ngay lập tức hoặc cửa sổ xem. –

+0

Phương pháp thứ hai hoạt động như thế nào sau đó ..? –

Các vấn đề liên quan