2012-09-13 31 views
9

Tôi muốn thử nghiệm một phương pháp để kiểm tra xem nó có lưu một giao dịch một cách chính xác hay không. Bên trong nó gọi Membership.GetUser() để xác minh người dùng làm cho thử nghiệm thất bại mỗi lần. Có cách nào để giả lập điều này để Memberhip.GetUser() luôn trả về một tên hợp lệ không?Làm thế nào để đơn vị phương pháp thử nghiệm sử dụng System.Web.Security.Membership bên trong?

Tôi đang sử dụng Moq, C# và ASP.Net 4.5 MVC

Trả lời

5

Tóm lại, bạn không thể. Đó là lý do tại sao mọi cuộc gọi đến một "dịch vụ" như vậy nên được ẩn đằng sau một sự trừu tượng hóa.

Bạn có thể xem mẫu mẫu đó trong mẫu MVC mặc định.

+1

Bạn có thể xây dựng? Mẫu sử dụng WebSecurity.Login(). Một cách tốt để trừu tượng là gì để các bài kiểm tra đơn vị không thực sự nhấn cơ sở dữ liệu? – GWTF

+2

Tìm thấy điều này có vẻ đầy hứa hẹn: http://blog.spontaneouspublicity.com/unit-testing-the-mvc4-account-controller. Đó có phải là loại trừu tượng mà bạn đang nói đến không? – GWTF

+0

@Scott liên kết bị hỏng. –

3

Có, như Serg đã nói, bạn có thể giả lập điều này bằng cách cung cấp giao diện cho dịch vụ thực để triển khai. Giao diện này sẽ có những phương pháp nào bạn đang gọi, chẳng hạn như:

public interface IMyServiceInterface 
{ 
    IMembershipUser GetUser(); 
    // other methods you want to use... 
} 

Trong các thử nghiệm đơn vị của bạn, bạn sẽ nói:

var mockService = new Mock<IServiceInterface>(); 
mockService.Setup(mock => mock.GetUser()). 
    Returns(new MembershipUserImplementation("MyTestUser", otherCtorParams)); 

Trong ví dụ của tôi, tôi sẽ tạo ra một wrapper cho MembershipUser cũng như nó có vẻ như nó cũng cần phải được đằng sau một trừu tượng.

+0

Bạn đang sử dụng khung mocking nào trong ví dụ này? –

+0

Tôi sử dụng [Moq] (http://code.google.com/p/moq/). Nó đơn giản và làm mọi thứ tôi cần nó để làm. – sfogle

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