2010-01-13 30 views
10

Sử dụng RhinoMocks - tôi có thể tìm nạp các tham số của hàm được gọi không? Ý tôi là; thế nào tôi có thể nhận được một số thông số chưa biết từ chức năng gọi ra?RhinoMocks - Tìm nạp thông số của các hàm được gọi

Tôi có giả lập và tôi mong đợi một số chức năng sẽ được gọi về điều này. Tôi biết một trong những thông số, nhưng một trong những khác là không rõ vì điều này xuất phát từ lớp có sử dụng mô hình và gọi một hàm trên đó. Cụ thể hơn - trong trường hợp này - đối số không xác định là hàm lambda. Đây là một hàm gọi lại được cho là sẽ được gọi khi hàm được thực hiện xong. Khi mô hình ngăn chặn gọi lại từ được gọi là tôi muốn lấy nó và gọi nó là bản thân mình.

Vì vậy; Tôi muốn kiểm tra xem hàm có được gọi hay không. Tôi muốn đảm bảo rằng một số đối số là những đối số được mong đợi. Và tôi muốn nhận ra các đối số không xác định để thực hiện một số thao tác trên chúng sau đó.

Giả sử cả hai đối số là ints (vì đơn giản) Tôi muốn làm một cái gì đó như thế này:

int unknownInt; 
_fakeSomething.AssertWasCalled(factory => factory.Foo(1, out unknownInt)); 
// then play around with unknownInt.. 

này có thể được thực hiện? Tôi thấy có một Arg.Out, nhưng không thể làm cho nó hoạt động được ..

Lưu ý: Cập nhật câu hỏi vì nó có vẻ gây nhầm lẫn.

Trả lời

14
Arg<string>.Matches(arg => you got the argument here...); 

UPDATE:

Để lấy số thứ hai được thực hiện trên cuộc gọi đầu tiên của phương pháp Foo trên _fakeSomething:

string someArg = null; 
var args = _fakeSomething.GetArgumentsForCallsMadeOn(
    x => x.Foo(0, 0), 
    x => x.IgnoreArguments() 
); 
var int = (int)args[0][1]; 
+0

Cảm ơn. Nhưng từ những gì tôi hiểu đây là một trận đấu đơn giản? Hoặc tôi có thể sử dụng điều này để tìm đối số không? Tôi muốn lấy lý lẽ ra. Câu hỏi của tôi có thể đã gây hiểu lầm, vì vậy tôi đã cập nhật nội dung câu hỏi của mình. – stiank81

+0

Bây giờ nó rõ ràng hơn, xem cập nhật của tôi. –

+0

Đúng vậy! Cảm ơn! – stiank81

0

Không chắc chắn nếu nó có thể được thực hiện, nhưng thử nghiệm như vậy có thể dẫn đến các xét nghiệm không đáng tin cậy, như bạn không biết paramter thực tế đã được thông qua.

Nếu có thể, thử nghiệm trên dữ liệu rõ ràng. Nếu bạn f.eks vượt qua null thay vì giá trị thực, kiểm tra của bạn có thể sẽ vượt qua vì lý do sai.

Thử nghiệm với Arg.Is.Anything nên được thực hiện cẩn thận và khi bạn thực sự không quan tâm đến tham số, chẳng hạn như trong AssertWasNotCalled.

+0

Tôi không đồng ý với bạn. Để đề cập đến một ví dụ tôi có một proxy dịch vụ mà tôi Mock. Tôi tiêm proxy dịch vụ này khi tạo một đối tượng foo của một số lớp sẽ sử dụng nó. Sau đó tôi gọi một hàm trên đối tượng foo, và tôi mong đợi hàm này gọi một hàm trên mô hình proxy dịch vụ với một số đối số mà tôi mong đợi và cũng có chức năng gọi lại riêng tư cho lớp đó. Bây giờ tôi muốn kiểm tra xem hàm đã được gọi với các đối số dự kiến ​​chưa, nhưng tôi không thể kiểm tra xem có gọi lại riêng và do đó chỉ định Arg.Is.Anything hay không. Tôi không quan tâm về lập luận đó, vậy tại sao tôi không nên? – stiank81

+1

Ahh tôi hiểu rồi. Tôi đã gặp một số rắc rối khi kiểm tra các cuộc gọi lại và lambdas. Tôi đi đến kết luận rằng thiết kế của tôi đã sai. Điều tuyệt vời về thử nghiệm và đặc biệt là TDD là nó cho bạn biết khi thiết kế của bạn sai. Dù thiết kế của bạn có sai hay không Tôi không thể nói cho bạn biết, nhưng nếu bạn thấy rằng mã của bạn khó kiểm tra có thể bạn nên xem xét lại thiết kế của mình. – Henning

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