2013-04-20 36 views
9

Tôi có một phương pháp trên giao diện của tôi trông giống như:Moq - biểu LINQ trong kho - Xác định biểu hiện trong thiết lập

T GetSingle(Expression<Func<T, bool>> criteria); 

Tôi đang cố gắng để thử một cái gì đó thiết lập như thế này (tôi nhận ra đây không phải là đang hoạt động):

_mockUserRepository = new Mock<IRepository<User>>(); 
_mockUserRepository.Setup(c => c.GetSingle(x => x.EmailAddress == "[email protected]")) 
    .Returns(new User{EmailAddress = "[email protected]"}); 

Tôi nhận ra rằng mình đang truyền tham số sai cho thiết lập.
Sau khi đọc this answer tôi có thể lấy nó làm việc bằng cách đi qua trong các biểu thức, như thế này:

_mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func<User, bool>>>()) 
    .Returns(new User{EmailAddress = "[email protected]"}); 

Tuy nhiên, điều này có nghĩa là nếu tôi gọi là phương pháp GetSingle với bất kỳ biểu hiện, cùng một kết quả được trả về.

Có cách nào chỉ định trong thiết lập, Biểu thức nào sẽ sử dụng không?

Trả lời

3

Nếu bạn không nhớ một tập chung lên, nó có thể đơn giản như thế này.

_mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func<User, bool>>>())) 
    .Returns(new User { EmailAddress = "[email protected]" }); 
+3

Tôi không thấy cách này trả lời câu hỏi. Người hỏi nói cụ thể anh ta muốn tránh sử dụng một biểu thức chung chung. –

+0

Bộ nhớ của tôi hơi mơ hồ, nhưng câu hỏi ban đầu là về chế nhạo phương thức chấp nhận biểu thức. Tôi nghĩ Alex đã cập nhật câu hỏi, vì anh ấy muốn trả về kết quả khác nhau tùy thuộc vào biểu thức đã cho. – Andy

+0

Câu chuyện có thể;) –

7

tôi quản lý để có được điều này để làm việc:

Expression<Func<User, bool>> expr = user => user.EmailAddress == "[email protected]"; 

_mockUserRepository.Setup(c => c.GetSingle(It.Is<Expression<Func<User, bool>>>(criteria => criteria == expr))) 
    .Returns(new User { EmailAddress = "[email protected]" }); 

User result = _mockUserRepository.Object.GetSingle(expr);