2011-07-15 41 views
8

Trong NUnit tôi có thể làm như sau:NUnit kiểm tra tất cả các giá trị của một mảng (với sự khoan dung)

Assert.That(1.05,Is.EqualTo(1.0).Within(0.1)); 

Tôi cũng có thể làm điều đó:

Assert.That(new[]{1.0,2.0,3.0},Is.EquivalentTo(new[]{3.0,2.0,1.0})); 

Bây giờ tôi sẽ muốn làm điều gì đó dọc theo các dòng này

Assert.That(new[]{1.05,2.05,3.05}, 
    Is.EquivalentTo(new[]{3.0,2.0,1.0}).Within(0.1)); 

Ngoại trừ từ khóa Within không được hỗ trợ trong tình huống đó. Có cách nào khác hay cách tiếp cận khác cho phép làm điều đó một cách dễ dàng?

Trả lời

10

Bạn có thể thiết lập mức Tolerance mặc định cho điểm nổi:

GlobalSettings.DefaultFloatingPointTolerance = 0.1; 
Assert.That(new[] {1.05, 2.05, 3.05}, Is.EquivalentTo(new[] {3.0, 2.0, 1.0})); 
+0

Đó là những gì tôi đang tìm kiếm. Nó sẽ tốt hơn nếu nó là địa phương cho một bài kiểm tra duy nhất nhưng nó đủ tốt cho bây giờ. Cảm ơn – Benoittr

5

Bạn có thể làm:

var actual = new[] {1.05, 2.05, 3.05}; 
var expected = new[] { 1, 2, 3 }; 
Assert.That(actual, Is.EqualTo(expected).Within(0.1)); 

Tuy nhiên, Is.EqualTo ngữ nghĩa hơi khác so với Is.EquivalentTo - EquivalentTo bỏ qua trật tự ({1, 2, 3} là tương đương, nhưng không bằng {2, 1, 3}). Nếu bạn muốn bảo tồn ngữ nghĩa này, giải pháp đơn giản nhất là sắp xếp các mảng trước khi xác nhận. Nếu bạn định sử dụng cấu trúc này rất nhiều, tôi khuyên bạn nên viết ràng buộc của riêng bạn cho điều đó.

1

Chắc chắn, bạn có thể sử dụng EqualTo để kiểm tra giá trị mảng. Như thế này:

/// <summary> 
    /// Validate the array is within a specified amount 
    /// </summary> 
    [Test] 
    public void ValidateArrayWithinValue() 
    { 
    var array1 = new double[] { 0.0023d, 0.011d, 0.743d }; 
    var array2 = new double[] { 0.0033d, 0.012d, 0.742d }; 

    Assert.That(array1, Is.EqualTo(array2).Within(0.00101d), "Array Failed Constaint!"); 
    } // ValidateArrayWithinValue 
+1

Tôi tin rằng Benoittr muốn bảo tồn ngữ nghĩa của Is.EquivalentTo. Bài kiểm tra của bạn không bỏ qua thứ tự các mục trong mảng. – maciejkow

0

Bạn có cố gắng sử dụng CollectionAssert? Có rất nhiều phương pháp để thực hiện các loại so sánh khác nhau.

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