2009-07-21 35 views
6

Tôi đang cố gắng kiểm tra đơn vị một hành động điều khiển sử dụng nhà cung cấp thành viên để cập nhật chi tiết người dùng. Tôi đang sử dụng Moq cho đến nay đã được dễ sử dụng.Mocking VB.NET Phương pháp với Moq

Vấn đề là tôi dường như không thể làm cho nó giả lập cuộc gọi đến các phương thức không trả lại bất cứ điều gì.

<TestMethod()> _ 
Public Sub Can_Update_User() 
    ' Arrange 
    _membershipService.Setup(Function(x) x.UpdateUser(It.IsAny(Of MembershipUser))) 
    Dim controller As New UsersController(_membershipService.Object, _roleProvider.Object, _supportWorksService.Object, _portalClientService.Object) 
    ' Act 
    Dim result As ViewResult = controller.Edit("testUser", New FormCollection) 
    ' Assert 
    Assert.AreEqual("Index", result.ViewName) 
End Sub 

Các thiết lập của dịch vụ thành viên chế giễu sẽ không biên dịch, lỗi này là:

độ phân giải quá tải thất bại vì không thể tiếp cận 'Thiết lập' có thể được gọi với những lập luận này:

'Chức năng công cộng Thiết lập (của TRESult) (biểu hiện là System.Linq.Expressions.Expression (Of System.Func (Of Services.IMembershipServic e, TResult))) Moq.Language.Flow.ISetup (Trong số Dịch vụ.IMembershipService, TResult) ': Biểu thức không sản xuất một giá trị.

'Chức năng Cài đặt Công (Tất TResult) (biểu hiện Như System.Linq.Expressions.Expression (Tất System.Func (Tất Services.IMembershipService, TResult))) Như Moq.Language.Flow. ISetup (Trong số Dịch vụ.IMembershipService, TResult) ': Loại dữ liệu của loại tham số không thể được suy ra từ các đối số này. Chỉ định dữ liệu loại (s) rõ ràng có thể sửa lỗi này .

'Public Function Setup (biểu hiện Như System.Linq.Expressions.Expression (Tất System.Action (Tất Services.IMembershipService))) Như Moq.Language.Flow.ISetup (Tất Services.IMembershipService) ': Biểu thức không tạo ra giá trị.

Tôi đã bỏ lỡ điều gì? Tôi sẽ phải tạo ra một lớp giả hơn là sử dụng Moq bất cứ lúc nào lớp học của tôi có một phương pháp tôi muốn gọi vào nó?

Edit:

Ok, đọc một chút xung quanh cho thấy đây là do cách lambdas được thể hiện trong VB sử dụng Function() mà phải có một kết quả.

Có ai tìm thấy một công việc xung quanh cho điều này hoặc tôi sẽ phải mương Moq cho phương pháp giả mạo?

Trả lời

6

Như bạn đã tìm thấy, phiên bản hiện tại của VB.NET (VB9) chỉ cho phép các phương thức lambda trả về một giá trị (ví dụ: Function lambdas). Không thực sự nhiều bạn có thể làm điều đó khác hơn là create a function to return a dummy value. Tôi không thể kiểm tra nó tại thời điểm này, vì vậy tôi không chắc chắn đó là một cách giải quyết khả thi cho trường hợp này.

Trong next version of VB.NET (VB10), ngôn ngữ sẽ hỗ trợ Sub lambdas và phải trợ giúp trong những trường hợp này.

Có vẻ như những người khác cũng là having trouble các mức độ khác nhau với kết hợp Moq/VB.NET hiện tại.

+0

: (Xấu hổ thực sự, ngoài việc tôi thực sự yêu Moq. Nếu tôi đề nghị với ông chủ chúng tôi phát triển thêm một năm để họ có thể lấy VB10 ra tôi nghĩ anh ta sẽ giết tôi! – Nick

1

Dường như là this niêm phong thỏa thuận.

Loại một cuộc điều tra thất vọng đã khiến tôi mất khá nhiều thời gian. :/

0

Typemock đã hỗ trợ cho VB.NET API thân thiện cho mục đích đó: http://site.typemock.com/vbpage/2009/9/10/unit-testing-vbnet.html

+3

Thật không may là một nhóm nhỏ các nhà phát triển nội bộ, chúng tôi không thể biện minh cho chi phí của TypeMock Hiện tại chúng tôi chỉ viết các phương thức mà chúng tôi cần để giả lập như các hàm trả về một boolean và chờ đợi VB10. – Nick

7

Trong Visual Studio 2010 sử dụng

serviceMock.Setup(Sub(c) c.MethodName(paramName)) 

Ngoài ra, hãy chắc chắn rằng các thực thể chế giễu (serviceMock) là một trong hai chế giễu như một giao diện, hoặc có MethodName được khai báo là overrideable.

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