Cách thành ngữ để xác minh kích thước bộ sưu tập trong xUnit là gì?


112

Tôi có trong bộ thử nghiệm của mình một bài kiểm tra giống như sau:

[Fact]
public void VerifySomeStuff()
{
    var stuffCollection = GetSomeStuff();

    Assert.Equal(1, stuffCollection.Count());
}

Kiểm tra này hoạt động như tôi mong đợi, nhưng khi tôi chạy nó xUnit sẽ in cảnh báo:

cảnh báo xUnit2013: Không sử dụng Assert.Equal () để kiểm tra kích thước bộ sưu tập.

Tuy nhiên, không có giải pháp thay thế nào được đề xuất trong cảnh báo và tìm kiếm trên google đưa tôi đến mã nguồn trong xUnit để kiểm tra xác minh cảnh báo này được in.

Nếu Assert.Equal()không phải là cách chính xác để xác minh độ dài của tập hợp, thì đó là gì?


Để làm rõ: Tôi nhận ra rằng tôi có thể "lừa" xUnit không đưa ra cảnh báo này bằng cách trích xuất một biến hoặc sử dụng Assert.True(stuff.Count() == 1)thay thế. Cái thứ hai chỉ là hacky và cái thứ nhất có cảm giác như nếu xUnit đang cố gắng tránh nhiều lần lặp lại của một IEnumerable<T>, thì đây là cách làm sai (bởi vì tôi sẽ nhận được gợi ý trình biên dịch về điều đó riêng nếu nó là một vấn đề) và xUnit chính nó sẽ không bao giờ phải đánh giá đầu vào nhiều lần (trên thực tế, nó có thể sẽ nhận được cùng một đầu vào bất kể trích xuất biến, vì cách gọi hàm C # hoạt động).

Vì vậy, tôi không chỉ quan tâm đến việc xóa cảnh báo đó khỏi đầu ra của mình. Câu trả lời cho câu hỏi của tôi cũng giải thích lý do tại sao cảnh báo đó được đưa vào thư viện ngay từ đầu và tại sao tôi nên sử dụng bất kỳ phương pháp nào để thay thế thì tốt hơn.


nếu bạn lưu trữ stuffCollection.Count()trong một biến riêng biệt và chuyển nó vào xác nhận thì nó có gây ra lỗi tương tự cho bạn không?
hellyale

Có lẽ cái này ?
Uwe Keim

Câu trả lời:


112

Xunit cung cấp các bản sửa lỗi nhanh chóng cho hầu hết các cảnh báo của nó, vì vậy bạn sẽ có thể thấy những gì nó cho là "đúng".

xunit

Trong trường hợp của bạn, nó muốn bạn sử dụng Assert.Singlevì bạn đang mong đợi chính xác một mặt hàng. Nếu bạn đang xác nhận một số tùy ý, như 412, thì nó sẽ không đưa ra cảnh báo cho bạn về việc sử dụng Count. Nó sẽ chỉ đề xuất sử dụng Singlenếu bạn đang mong đợi một mặt hàng hoặc Emptynếu bạn không mong đợi mặt hàng nào.


6
Cảm ơn, điều đó có ý nghĩa. FWIW, tôi đã thấy điều này khi xây dựng trong VS Code, nơi hành động nhanh không hiển thị, vì vậy thực sự bao gồm đề xuất sửa lỗi trong thông báo cảnh báo sẽ hữu ích hơn nhiều.
Tomas Aschan

2
@TomasLycken - à. Có, có một vấn đề xảy ra ở đây: github.com/xunit/xunit/issues/1423
vcsjones

5
Tôi không phải là một fan hâm mộ của hành vi đó; đôi khi số 1 chỉ là ngẫu nhiên và có vẻ ít biểu đạt hơn khi thực thi lệnh gọi tới .Single (). Bài kiểm tra có thể thay đổi để mong đợi một số đếm khác và có vẻ khó chịu khi phải thực hiện thay đổi để gọi một phương thức hoàn toàn khác thay vì chỉ thay đổi một số.
vargonian

2
Single rất tuyệt đối với một Item duy nhất, tôi có 3 item và tôi không muốn viết Assert.Collection đầy đủ, liệu xUnit có Assert.Triple không? haha
Pawel Cioch 13:19

1
@PawelCioch theo xunit.net/xunit.analyzers/rules/xUnit2013.html họ có Empty, SingleNotEmpty- nếu bạn mong đợi một giá trị động xUnit2013 không nên kích hoạt.
mbx

2

Tôi thấy điều này gây cho tôi cùng một lỗi:

Assert.Equal(2, vm.Errors.Count());

Và việc truyền nó đã ngăn lỗi xuất hiện.

Assert.Equal(2, (int)vm.Errors.Count());

2
Tôi khá chắc chắn, đây là không những ideomatic cách.
mbx

1

Đối với một phần tử trong danh sách, tốt nhất là sử dụng phần tử này để thay thế: Assert.Single(resultList);


-1

Tôi đã gặp vấn đề tương tự khi sử dụng thuộc tính Count như bên dưới trong xUnit.

nhập mô tả hình ảnh ở đây

Sau đó, tôi sử dụng hàm Count () trên bộ sưu tập, nó đã khắc phục sự cố của tôi.


Đã khắc phục sự cố nhưng bạn vẫn không sử dụng XUnit như bình thường!
Daniel Eisenreich 19/09/18

8
@DanielEisenreich đâu là cách chính xác để khẳng định số lượng cho một số cụ thể nếu nó lớn hơn 1?
SomeGuyOnAComputer 28/09/18

@SomeGuyOnAComputer và 4 phiếu ủng hộ khác. Quên những gì tôi đã nói, tôi đã quá hỗn hào. Nếu nó lớn hơn, bạn không có lựa chọn nào khác.
Daniel Eisenreich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.