2011-02-03 37 views
5

Tôi đang cố gắng tìm ra cách Mock (sử dụng khung công tác Moq) tất cả các công trình, nhưng tôi đã trở thành một chút nhầm lẫn với các phương thức trả về void.Moq một phương pháp void

Đối tượng ban đầu có các phương pháp/thuộc tính sau:

void Add(Person entity); 
void Save(); 
IQueryable<Person> Persons; 

Add phương pháp gọi InsertOnSubmit (đó là LINQ to SQL), và phương thức Save gọi Context.SubmitChanges(). Thuộc tính của Person trả về đối tượng Table<News>.

Tôi không chắc chắn làm thế nào tôi đi về chế nhạo các phương pháp này tuy nhiên, như tôi rõ ràng không thể sử dụng Returns().

Hoặc thiết kế của tôi có nghĩa là tôi thực sự không thể giả lập đối tượng đúng cách?

+0

Nếu không có thêm ngữ cảnh thì có một chút khó khăn để đưa ra câu trả lời hay. – mfloryan

Trả lời

3

Tùy thuộc vào những gì bạn định thử nghiệm.

Moq có thể giúp bạn đáng kể khi bạn muốn kiểm tra các tương tác giữa lớp đang được kiểm tra và các lớp khác.

Trong trường hợp bạn đang mô tả bạn đang có lẽ thử nghiệm một lớp học đó là sử dụng lớp với các phương pháp và tài sản nêu trên. Để xác minh các tương tác bạn muốn kiểm tra nếu phương thức Add được gọi với các tham số dự kiến, phương thức Save được gọi và thuộc tính Persons được tham chiếu để đọc kết quả. Điều này có thể đạt được theo cách sau:

var mockedClass = new Mock<IDaoClass>(); 
var classUnderTest = ... 

mockedClass.SetupGet(m => m.Persons).Returns(new List<Person>().AsQueryable()); 

classUnderTest.DoSomething(); 

mockedClass.Verify(m => m.Add(It.IsAny<Person>())); 
mockedClass.Verify(m => m.Save()); 

Nếu bạn muốn kiểm tra cái gì khác và cung cấp một cuống thực hiện các phương pháp sau đó bạn có thể muốn chỉ cần tạo triển khai thử nghiệm hoặc xem xét sử dụng các thiết lập Moq với các chức năng thể hiện như lambdas hơn là thiết lập đơn giản.

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