2012-09-16 32 views
5

Vấn đề của tôi là tôi muốn tạo một thuộc tính trong lớp trừu tượng của mình, vì lớp của tôi trong bài kiểm tra sử dụng thuộc tính đó. Tôi hiện đang sử dụng phiên bản mới nhất của Moq.Kiểm thử đơn vị một lớp kế thừa từ lớp trừu tượng

lớp trừu tượng của tôi trông như thế này:

public abstract class BaseService 
{ 
    protected IDrawingSystemUow Uow { get; set; } 
} 

Và lớp học của tôi trong thử nghiệm trông như thế này:

public class UserService : BaseService, IUserService 
{ 
    public bool UserExists(Model model) 
    { 
     var user = this.Uow.Users.Find(model.Id); 
     if(user == null) { return false; } 

     reurn true; 
    } 
} 

Tôi không thể hiểu làm thế nào tôi có thể còn sơ khai các Uow tài sản. Có ai có bất kỳ đầu mối? Hay thiết kế của tôi tệ đến nỗi tôi cần phải chuyển sang tài sản Uow cho lớp học của mình trong bài kiểm tra?

Trả lời

9

Thiết lập hiện tại của bạn sẽ không hoạt động vì một lý do đơn giản - Uow thuộc tính không thể ghi đè và công việc của Moq được thực hiện tại thời điểm này. Cannot override, cannot mock.

Giải pháp dễ nhất là chỉ cần làm cho thuộc tính đó có thể ghi đè. Thay đổi định nghĩa lớp cơ sở của bạn để:

public abstract class BaseService 
{ 
    protected virtual IDrawingSystemUow Uow { get; set; } 
} 

Bây giờ bạn có thể sử dụng bảo vệ tính năng Moq của (điều này đòi hỏi bạn phải bao gồm using Moq.Protected namespace trong lớp thử nghiệm của bạn):

// at the top of the file 
using Moq.Protected; 

// ... 

var drawingSystemStub = new Mock<IDrawingSystemUow>(); 
var testedClass = new Mock<UserService>(); 
testedClass 
    .Protected() 
    .Setup<IDrawingSystemUow>("Uow") 
    .Returns(drawingSystemStub.Object); 

// setup drawingSystemStub as any other stub 

// exercise test 
var result = testedClass.Object.UserExists(...); 
+0

Cảm ơn bạn rất nhiều điều đó đã thực sự hữu ích! Đó là một lỗi nhỏ trong đoạn mã của bạn. Trả về (drawingSystemStub) nên được thay thế bằng Returns (drawingSystemStub.Object). =) – Rikard

+0

@Rikard: cảm ơn, đã sửa. –

+0

FYI @jimmy_keen - Liên kết cho "Không thể ghi đè, không thể giả mạo" bị hỏng – lukejkw

0

Tôi nghĩ rằng trong trường hợp của bạn nó khá đơn giản. Bạn chỉ cần không chế giễu tài sản Uow nhưng dịch vụ IDrawingSystemUow. Vì vậy, bạn có thể tạo mô hình IDrawingSystemUow, gán nó cho phiên bản UserService qua thuộc tính Uow và sau đó chạy thử nghiệm (ví dụ: phương pháp UserExists).

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