2010-07-29 16 views
30

Đang cố gắng để thử các phương pháp sau đây:Sử dụng Rhino Mocks để thử một tham số ra, mà được tạo ra trong phương pháp Tôi đang thử nghiệm

bool IsLoginValid(LoginViewModel viewModel, out User user); 

Cố gắng này ban đầu:

dependency<ILoginService>() 
.Stub(serv => 
     serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Is.Anything) 
.Return(false); 

Nhưng, thất bại , vì nó là một tham số ngoài. Đã có một chút tìm kiếm và thay đổi mã của tôi như vậy:

dependency<ILoginService>() 
.Stub(serv => 
     serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Out(new User()).Dummy)) 
.Return(false); 

Điều đó cũng không thành công. Tôi cần 'Người dùng mới' ('Người dùng mới') mới là một đối số 'Bất cứ điều gì'. Như tôi nghĩ rằng đó là mong đợi một ví dụ cụ thể.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này? Cảm ơn các bạn.

+1

Lỗi nào bạn nhận được trong trường hợp cuối cùng? Có vẻ đúng ... – Grzenio

Trả lời

39

Hãy thử tùy chọn "OutRef". Nó chấp nhận một đối tượng param [] xác định kết quả cho mỗi tham số. Vì bạn chỉ có một cái, bạn chỉ cần một kết quả. Dưới đây là một cách nhanh chóng mock-up của những gì tôi đã cố gắng mà nên làm việc trong tình huống của bạn:

var foo = MockRepository.GenerateStub<IFoo>(); 
var viewModel = new LoginViewModel(); 
User temp; 
foo.Stub(f => f.IsLoginValid(viewModel, out temp)).OutRef(new User()).Return(false); 

User outparam; 
Assert.IsFalse(foo.IsLoginValid(viewModel, out outparam)); 
+1

Aaah, vâng, bạn là huyền thoại tuyệt đối. Điều đó làm việc hoàn hảo. Cảm ơn anh bạn! – ctrlplusb

12

Thay đổi câu trả lời được chấp nhận (bởi @Patrick Steele) để phù hợp với tên biến và khoảng trắng trong câu hỏi:

.Stub(serv => serv.IsLoginValid(
      a_login_viewmodel, 
      out temp)).OutRef(new User()) 
.Return(false); 

... sau đó thay đổi cú pháp (nhưng không phải là ngữ nghĩa) cho thông thạo Args cú pháp:

.Stub(serv => serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Out(new User()).Dummy)) 
.Return(false); 

... sau đó chúng tôi kết thúc với cùng một cú pháp chính xác là nỗ lực thứ hai của OP, whic h dường như "thất bại". Cá nhân, tôi thích phong cách 'Args' thông thạo hơn, mặc dù nó hơi dài dòng hơn.

TL; DR nỗ lực thứ hai của OP tương đương ngữ nghĩa với câu trả lời được chấp nhận, chỉ sử dụng một cú pháp khác.

+0

Tôi không hiểu, ví dụ cú pháp Args thông thạo trong câu trả lời của bạn giống như cách tiếp cận thứ hai @ctrlplusb. Anh ta phàn nàn rằng điều này cũng không chạy. Tui bỏ lỡ điều gì vậy? –

+0

@AntonKalcik: những gì * _I_ * không nhận được là lý do tại sao OP nói "Điều đó làm việc hoàn hảo" và chấp nhận nó là Câu trả lời đúng một khi ngữ nghĩa tương đương với điều mà anh ta nói "không thành công". Câu trả lời của tôi về cơ bản nói, đừng bỏ qua cú pháp cấp trên chỉ bởi vì bạn đã vô tình chỉnh sửa lỗi khi bạn viết lại nội dung. " – onedaywhen

+0

Bạn nói đúng, chỉ muốn hỏi, bởi vì tôi đã nhầm lẫn. Tôi đã thử nó và cú pháp của bạn bắt chước chính xác Patrick Steel's mã. –

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