2009-08-16 26 views
9

Tôi đang gặp sự cố khi xác minh tham số loại Ienumerable/Array khi thiết lập kỳ vọng cho các phương thức gọi trên đối tượng giả của tôi. Tôi nghĩ rằng vì nó khớp với các tham chiếu khác nhau nên nó không coi đó là một sự trùng khớp. Tôi chỉ muốn nó để phù hợp với nội dung của mảng, đôi khi tôi thậm chí không quan tâm đến thứ tự.Tham số Moq và Xác minh Mảng/IEnumerable trong thiết lập phương pháp

mockDataWriter.Setup(m => m.UpdateFiles(new string[]{"file2.txt","file1.txt"})); 

Lý tưởng nhất là tôi muốn thứ gì đó hoạt động như sau, tôi có thể viết phương pháp mở rộng để thực hiện việc này.

It.Contains(new string[]{"file2.txt","file1.txt"}) 

It.ContainsInOrder(new string[]{"file2.txt","file1.txt"}) 

duy nhất được xây dựng theo cách tôi có thể phù hợp với những ngay bây giờ là với tính năng vị ngữ, nhưng có vẻ như vấn đề này là phổ biến đủ nó phải được xây dựng trong.

Có được xây dựng theo cách để phù hợp với các loại này hoặc thư viện tiện ích mở rộng mà tôi có thể sử dụng. Nếu không, tôi sẽ chỉ viết một phương pháp mở rộng hoặc một cái gì đó.

Cảm ơn

+1

Xem nếu câu hỏi này/câu trả lời giúp tại tất cả: http://stackoverflow.com/questions/1220013/expectation-on-mock-object-doesnt-seem-to -be-met-moq –

Trả lời

7

Đã phải thực hiện một số quẹt tùy chỉnh, đã không tìm thấy bất kỳ khác được xây dựng theo cách để thực hiện điều này trong phiên bản 3. Dùng http://code.google.com/p/moq/wiki/QuickStart như một nguồn tài nguyên.

public T[] MatchCollection<T>(T[] expectation) 
{ 
    return Match.Create<T[]>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 

public IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 


public void MyTest() 
{ 

... 

mockDataWriter.Setup(m => m.UpdateFiles(MatchCollection(new string[]{"file2.txt","file1.txt"}))); 

... 


} 
+0

Lưu ý rằng điều này chỉ kiểm tra nếu tất cả các giá trị dự kiến ​​là trong inputCollection, không phải là cách khác xung quanh. InputCollection vẫn có thể chứa các mục không có trong kỳ vọng. –

3

Bạn không cần hai phương pháp riêng cho mảng và IEnumerable:

private static IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => expectation.All(inputCollection.Contains)); 
} 
4

câu trả lời trước bởi Oleg không xử lý trường hợp inputCollection có yếu tố mà không phải là trong expectation.

Ví dụ:

MatchCollection(new [] { 1, 2, 3, 4 }) 

sẽ phù hợp inputCollection { 1, 2, 3, 4, 5 } khi nó rõ ràng không nên.

Đây là khớp hoàn chỉnh:

public static IEnumerable<T> CollectionMatcher<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create((IEnumerable<T> inputCollection) => 
         !expectation.Except(inputCollection).Any() && 
         !inputCollection.Except(expectation).Any()); 
} 
+0

Cảm ơn bạn đã xử lý trường hợp đặc biệt. – saxos

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