2012-07-09 33 views
11

Để kiểm tra đơn vị, tôi đang sử dụng NUnit 2.6 và Moq 4.0. Có một trường hợp cụ thể liên quan đến các thành viên ảo, nơi các đối tượng proxy của Moq không chuyển tiếp các cuộc gọi phương thức đến việc thực hiện thực tế (có thể là do thiết kế). Ví dụ, nếu tôi đã có một lớp ...Mocking các thành viên ảo trong Moq

public class MyClass { 
    protected virtual void A() { 
     /* ... */ 
    } 

    protected virtual void B(...) { 
     /* ... */ 
    } 
} 

... và tôi sử dụng Moq để ghi đè GetSomethingElse 's A() phương pháp trong trận đấu thử nghiệm của tôi ...

var mock = new Mock<MyClass>(); 
mock.Protected().Setup("A").Callback(SomeSortOfCallback); 

... sử dụng phương thức A của mock hoạt động lộng lẫy; Tuy nhiên, nếu bất cứ điều gì trong phương pháp nói sẽ gọi phương thức không được giả lập B, phương thức sẽ không làm gì và/hoặc trả lại giá trị mặc định, ngay cả khi thực hiện thực tế tồn tại trong MyClass.

Có cách nào để giải quyết vấn đề này không? Tôi có sử dụng Moq sai không?

Cảm ơn trước,
Manny

Trả lời

17

Set mock.CallBase = true và bạn sẽ được tốt để đi.

+0

nếu bạn vẫn muốn thử các phương pháp khác thì sao? –

+1

@LouisRhys Khá chắc chắn điều này không ảnh hưởng đến nó - nếu bạn mô tả rõ ràng một thứ gì đó, cài đặt 'CallBase' sẽ không bao giờ được phát. –

-1
var systemUnderTest = new Moq.Mock<ProcessBulkData> { CallBase = true }; 
systemUnderTest.Setup(s => s.MethodName(...)).Returns(...); 
var actual=systemUnderTest.Object.BulkInsert(...); 
+3

Tốt hơn nên bao gồm một số giải thích về mã cùng với câu trả lời của bạn. – EJoshuaS

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