Trả về giá trị đã được truyền vào một phương thức


391

Tôi có một phương pháp trên một giao diện:

string DoSomething(string whatever);

Tôi muốn chế giễu điều này với Moq, để nó trả về bất cứ thứ gì đã được chuyển vào - đại loại như:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

Có ý kiến ​​gì không?

Câu trả lời:


527

Bạn có thể sử dụng lambda với một tham số đầu vào, như vậy:

.Returns((string myval) => { return myval; });

Hoặc dễ đọc hơn một chút:

.Returns<string>(x => x);

1
Có vẻ khá dễ dàng cho đến khi bạn cần phải làm điều này cho một phương thức với 7 đối số ... Khi tôi kiểm tra IReturnstrong Moq, nó xác định Returnscho 4 tranh luận tại nhất . Bất kỳ cách dễ dàng để có được xung quanh đó? / Ý tôi là ngoại trừ sửa đổi nguồn Moq /
mizuki nakeshu

14
ok, nó được xác định cho tối đa 9 đối số trong Moqv 4.0.0.0. đã giải quyết :)
mizuki nakeshu

14
@mizukinakeshu Tôi sẽ xem xét một chút cấu trúc lại của phương thức đối số 9 vì có vẻ như lớp / phương thức này đang làm quá nhiều. Có lẽ tái cấu trúc 9 tham số thành một lớp cài đặt hoặc struct để giúp bạn sau này?
Thượng nghị sĩ

@TheSenator Đồng ý, tôi không phản ứng lại những gì đã xảy ra nhưng tôi đoán tôi chỉ đang hack một số bài kiểm tra đơn vị với mã đã tồn tại mà tôi không sửa đổi, nếu không, số lượng đối số này chắc chắn kêu gọi tái cấu trúc.
mizuki nakeshu 9/2/2015

27
Chỉ là một lưu ý vì điều này làm tôi bối rối: Chuỗi trong .Returns<string>đề cập đến (các) tham số đầu vào chứ không phải các giá trị bạn đang trả về.
Jim

241

Thậm chí hữu ích hơn, nếu bạn có nhiều tham số, bạn có thể truy cập bất kỳ / tất cả chúng với:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

Bạn luôn cần tham chiếu tất cả các đối số, để khớp với chữ ký của phương thức, ngay cả khi bạn chỉ sử dụng một trong số chúng.


17
Đây phải là câu trả lời được chấp nhận. Đây chính xác là những gì bạn cần làm. Bất cứ điều gì khác ném một ngoại lệ "số lượng đối số dự kiến".
Chaim Eliyah

Phải, chắc chắn phân bổ dễ đọc hơn và làm việc với ReturnsAsyncquá!
Piotr Kula

1
Câu trả lời này đã lưu trong ngày. Lưu ý (độc giả tương lai), bạn cũng có thể đưa nó đi xa hơn một chút. .Returns ((chuỗi a, chuỗi b, chuỗi c) => {chuỗi d = "wow"; return chuỗi.Concat (a, b, c, d);});
granadaCoder ngày

1
Cá nhân, đây là một câu trả lời tốt hơn nhiều. Tôi có rất ít kiến ​​thức về Moq nhưng tôi vẫn hiểu nó ngay lập tức.
unrealsoul007

Đối với các phương thức trả về void tôi đã sử dụng .Callback ((chuỗi a, Ngoại lệ b, chuỗi c) => ném Ngoại lệ mới (b.Message));
tymtam

62

Returns<T>Phương pháp chung có thể xử lý tình huống này độc đáo.

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

Hoặc nếu phương thức yêu cầu nhiều đầu vào, hãy chỉ định chúng như sau:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
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.