2011-10-14 18 views
6

Tôi đánh giá cao bất cứ ai có thể giúp tôi trong vấn đề dưới đây: Tôi đã sử dụng RhinoMock trong bài kiểm tra đơn vị. tôi xác định đối tượng giả của tôi theo cách như vậy, với sessionToken là chuỗi gõ:.RhinoMock: Làm thế nào để Stub và trả về một phương pháp với đối tượng phức tạp như tham số

mockRepository.Stub(repository => repository.FindById(sessionToken)).Return(new DeviceTypeRepository().NewTable(false)); 

Đó là ok cho phần mã khi gọi FindById() để trả lại hợp lệ DeviceTypeRepository mới mới() NewTable (sai);

Tuy nhiên, khi bao gồm một tham số phức tạp như đối tượng, chẳng hạn như một DataTable, vào Stub như sau:

mockRepository.Stub(repository => repository.Find(sessionToken, dataTable)).Return(new DeviceTypeRepository().NewTable(false)); 

Sau đó, phần mã trong đó Find() được gọi, nó KHÔNG trả về DeviceTypeRepository mới dự kiến ​​(). NewTable (sai). Lưu ý rằng giá trị đầu vào của tham số dataTable giống nhau trong cả hai lệnh Stub và Find().

Do đó, câu hỏi của tôi là: Làm cách nào tôi có thể triển khai thông số như vậy (DataTable được nhập và thông thường hơn) vào khởi tạo Stub bằng RhinoMock? Tôi rất biết ơn mọi lời khuyên và cách tiếp cận. Cảm ơn

+0

'' '' '' '' 'hoặc' '' '' '' '' '' có 'giống' trong '' '' và 'Tìm()' không? – Jeroen

Trả lời

6

Nếu nó không trả lại những gì bạn mong đợi, thì các thông số giữa cuộc gọi gốc và cuộc gọi thực tế không khớp. Hãy nói rằng bạn có một cái gì đó như thế này:

// Set expectations 
var someDataTable = new DataTable(columns, raws); 
mockRepository 
    .Stub(repository => repository.Find(sessionToken, dataTable)) 
    .Return(new DeviceTypeRepository().NewTable(false)); 

// Actual test 
var anotherDataTable = new DataTable(columns, raws); 
yourTestObject.DoSomethingThatLooksForTheDataTable(repository); 

Điều ở đây là mặc dù someDataTableanotherDataTable có nội dung chính xác như nhau, chúng không phải là cùng một đối tượng và khi RhinoMocks so sánh cuộc gọi còn sơ khai với thực tế gọi thông số không khớp. Những gì bạn có thể làm là sử dụng các ràng buộc:

mockRepository 
    .Stub(repository => repository.Find(
     Arg<SessionID>.Matches(y => y.ID == 2), 
     Arg<DataTable>.Matches(x => x.Columns == columns && x.Raws == raws) 
    )) 
    .Return(true); 
+0

Có cách nào khác để sử dụng Contraints of RhinoMock không? Một cái gì đó giống nhau: mockRepository.Stub (repository => repository.Find (..., ...)). Contraints (Is.EqualTo (x), ...) –

8

Tôi tin rằng sự cố không nằm trong kiểu dữ liệu phức tạp mà là trong kỳ vọng bạn đã đặt.

Lần đầu tiên khắc phục, hãy thêm IgnoreArguments() trước Return. Có thể là DataTable bạn đã chỉ định trong sự mong đợi khác với thực-truyền-in DataTable dụ rất mong đợi sẽ không vượt qua:

...Stub(...).IgnoreArguments().Return(); 

Nếu không giúp bạn có thể gỡ lỗi nó bằng tay sử dụng WhenCalled():

...Stub(...).IgnoreArguments().WhenCalled(
    mi => 
    { 
     var token = mi.Arguments[0] as TokenDataType; 
     var dataTable = mi.Arguments[1] as DataTable; 
    }).Return(); 

Nếu điều đó không có tác dụng, hãy thử thêm Repeat().Any() sau Return() và xem nó có hoạt động hay không. Tôi giả sử rằng nếu phương pháp được gọi một vài lần, bạn có thể đã bỏ lỡ giá trị trả lại đầu tiên, nhưng tôi có thể sai.

+0

Tôi thích sử dụng WhenCalled. Tuy nhiên, với Stub bạn sẽ không cần phải thêm Repeat(). Any(), đó là hành vi mặc định. –

+0

@Amittai Shapira: điểm tốt, cảm ơn, bất kỳ tham chiếu đến tài liệu? Tôi chủ yếu sử dụng Mock và giả lập nó không lặp lại theo mặc định – sll

+1

Cảm ơn bạn đã yêu cầu bằng chứng. Tôi đã sai :-(hành vi của mocks và stubs trong trường hợp này là tương tự, mặc định là Repeat(). Once(): http://groups.google.com/group/rhinomocks/browse_thread/thread/03aff4992b5607cb –