2009-09-11 44 views
6

Trong đơn đăng ký của tôi, tôi có hai số tương đương enum s. Một người sống trong DAL, người còn lại trong lớp hợp đồng dịch vụ. Họ có cùng tên (nhưng trong các không gian tên khác nhau) và phải có cùng thành viên và giá trị.So sánh hai loại enum * tương đương?

Tôi muốn viết một bài kiểm tra đơn vị thực thi điều này. Cho đến nay, tôi đã có những điều sau đây:

public static class EnumAssert 
{ 
    public static void AreEquivalent(Type x, Type y) 
    { 
     // Enum.GetNames and Enum.GetValues return arrays sorted by value. 
     string[] xNames = Enum.GetNames(x); 
     string[] yNames = Enum.GetNames(y); 

     Assert.AreEqual(xNames.Length, yNames.Length); 
     for (int i = 0; i < xNames.Length; i++) 
     { 
      Assert.AreEqual(xNames[i], yNames[i]); 
     } 

     // TODO: How to validate that the values match? 
    } 
} 

Điều này làm việc tốt khi so sánh tên, nhưng làm cách nào để kiểm tra xem các giá trị có khớp không?

(Tôi đang sử dụng NUnit 2.4.6, nhưng tôi con số này áp dụng đối với bất kỳ khuôn khổ kiểm tra đơn vị)

Trả lời

13

Enum.GetValues:

var xValues = Enum.GetValues(x); 
var yValues = Enum.GetValues(y); 

for (int i = 0; i < xValues.Length; i++) 
{ 
    Assert.AreEqual((int)xValues.GetValue(i), (int)yValues.GetValue(i)); 
} 
+0

Ah, tôi đã thử Assert.AreEqual (int) xValues ​​[i], (int) yValues ​​[i]) và không có gì trong số đó. –

1

tôi sẽ lật theo cách bạn kiểm tra xung quanh. Nó dễ dàng hơn để có được một tên từ một giá trị thay vì một giá trị từ một tên. Lặp lại các giá trị và kiểm tra các tên cùng một lúc.

public static class EnumAssert 
{ 
    public static void AreEquivalent(Type x, Type y) 
    { 
     // Enum.GetNames and Enum.GetValues return arrays sorted by value. 
     var xValues = Enum.GetValues(x); 
     var yValues = Enum.GetValues(y); 

     Assert.AreEqual(xValues.Length, yValues.Length); 
     for (int i = 0; i < xValues.Length; i++) 
     { 
      var xValue = xValues.GetValue(i); 
      var yValue = yValues.GetValue(i); 
      Assert.AreEqual(xValue, yValue); 
      Assert.AreEqual(Enum.GetName(x, xValue), Enum.GetName(y, yValue)); 
     } 
    } 
} 
+0

Giả sử bạn đang thử nghiệm cho tương đương int và chuỗi tương đương của hai enums khác nhau, bạn đang thiếu một diễn viên: Assert.AreEqual (xValue, yValue); có thể là Assert.AreEqual ((int) xValue, (int) yValue) ;. Trong trường hợp đó, đây là một kiểm tra kỹ lưỡng hơn so với câu trả lời được chọn. – andes

+1

Câu trả lời này là chính xác, nhưng bạn cũng cần phải chuyển x, y thành lần thứ hai để bạn kiểm tra cả hai cách. Nếu không, bạn có thể có thêm những cái trong loại y không có trong loại x. –