2012-03-12 27 views
5

Tôi có một lớp thực hiện ICollection<SomeConcreteClass>. Các hạn chế về bộ sưu tập NUnit không nhận ra nó như một bộ sưu tập.Điều gì làm cho lớp học trở thành một bộ sưu tập theo các hạn chế về bộ sưu tập NUnit?

ví dụ: Assert.That(sut, Has.No.Member(someObjectOfTypeSomeConcreteClass)); ném System.ArgumentException : The actual value must be a collection

Assert.That(sut, Is.Empty); không thành công với sản phẩm nào sut.

Vậy khi nào là tập hợp một bộ sưu tập (theo NUnit)?

Stack Trace:

System.ArgumentException : The actual value must be a collection Parametername: actual 
at NUnit.Framework.Constraints.CollectionConstraint.Matches(Object actual) 
at NUnit.Framework.Constraints.NotConstraint.Matches(Object actual) 
    MyTestFile.cs(36,0): at MyAssembly.MyTestFixture.MyTestMethod() 

vấn đề trên xảy ra với NUnit 2.4.3.0. Tôi chỉ thử nó với 2.6. Is.Empty hoạt động ngay bây giờ, nhưng Has.No.Member vẫn không thành công. Nó thậm chí không gọi Equals() hoặc operator ==(). So sánh các yếu tố thu thập như thế nào? RhinoMocks Arg<MyCollection>.List.Count(Is.Equal(1)) hiện cũng không thành công.

Kết luận:
Với NUnit 2.4 bộ sưu tập các ràng buộc yêu cầu thực hiện ICollection phi chung cho các bộ sưu tập được công nhận là một bộ sưu tập (có trả lời cho câu hỏi ban đầu). IEnumerable bình đẳng hoạt động như mong đợi.

Với NUnit 2.6 (và có thể 3.0) bình đẳng của IEnumerable s được kiểm tra bằng các yếu tố phù hợp ngay cả khi Equals bị ghi đè. Đó là lý do tại sao ràng buộc thành viên không hoạt động nếu các phần tử là chính các số IEnumerable. Đây là một vấn đề đã biết (https://bugs.launchpad.net/nunit-3.0/+bug/646786).

Để biết chi tiết, hãy xem câu trả lời của riêng tôi.

+0

bạn có thể đăng stack đầy đủ của ném ngoại lệ? –

Trả lời

1

Tôi nghĩ rằng tôi đã tìm ra.

NUnit 2.4.3.0 cố gắng truyền tới không chung chung ICollection mà tôi không triển khai. Làm việc bây giờ với 2,4.

Trong NUnit 2.6.0.12051 có một NUnitEqualityComparer thực hiện điều này:

if (x is IEnumerable && y is IEnumerable && !(x is string && y is string)) 
    return EnumerablesEqual((IEnumerable)x, (IEnumerable)y, ref tolerance); 

Thành viên bộ sưu tập của tôi là IEnumerable và trong trường hợp thử nghiệm đều trống. Đó là lý do tại sao các ràng buộc tin rằng tất cả các trường hợp đều bình đẳng. Nhưng họ thì không. NUnitEqualityComparer giả định rằng một lớp hoặc có các thành viên (IEnumerable) hoặc nó có trạng thái riêng của nó. Lớp thành viên bộ sưu tập của tôi (được gọi là SomeConcreteClass trong câu hỏi) đều có thể đếm được và cũng có trạng thái khác, ví dụ: một thuộc tính Name. Bởi vì cách thức NUnitEqualityComparer hoạt động trạng thái bổ sung không được so sánh và các đối tượng rỗng với trạng thái bổ sung khác nhau được cho là sai.

Tôi sẽ thảo luận vấn đề này với Danh sách gửi thư NUnit và sẽ báo cáo lại tại đây.

Edit:

Hành vi này được biết: https://bugs.launchpad.net/nunit-3.0/+bug/646786

1

Xem ở đây http://www.nunit.org/index.php?p=collectionConstraints&r=2.5,

Đối với tài liệu tham khảo, Has.Member sử dụng bình đẳng đối tượng để tìm một thành viên trong một bộ sưu tập . Để kiểm tra đối tượng bằng một mục bộ sưu tập, sử dụng Has.Some.EqualTo (...).

Vì vậy, tôi cho rằng bạn không có .Equals (SomeConcreteClass) đã triển khai hoặc bộ sưu tập sẽ có thể đếm được.

+0

Tôi muốn khẳng định rằng bộ sưu tập KHÔNG chứa đối tượng đã cho. – EricSchaefer

+0

... và SomeConcreteClass thực hiện Equals – EricSchaefer

+0

Vì vậy, nó là một lựa chọn khác - IEnumerable, cũng @Daniel Rose khẳng định nó – Anton

2

Sau khi xem xét mã nguồn của NUnit 2.5.10: Ràng buộc đầu tiên gộp bộ sưu tập đã cho vào số IEnumerable không chung.

EDIT: Sau đó, nó chạy một foreach() trên bộ sưu tập và so sánh các mục. Vì vậy, AFAICT nó sẽ hoạt động.

Bạn đang sử dụng phiên bản NUnit nào?

+0

ICollection thừa hưởng cả IEnumerable và IEnumerable EricSchaefer

+0

có nghĩa là lớp học của tôi thực hiện cả biến thể chung và không chung chung ... – EricSchaefer

+0

@EricSchaefer Bạn nói đúng. Tôi đã sửa câu trả lời. –

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