2009-12-28 44 views

Trả lời

5

Bạn có thể giả lập bất kỳ giao diện nào và bất kỳ thành viên trừu tượng hoặc ảo nào. Đó là về cơ bản nó.

Điều này có nghĩa rằng sau đây là hoàn toàn có thể:

var imock = new Mock<IMyClass>(); 
var aMock = new Mock<SomeAbstractClass>(); 

Nếu các thành viên được thừa kế từ SomeAbstractClass không được niêm phong, bạn cũng có thể MyClass giả:

var mcMock = new Mock<MyClass>(); 

Cho dù điều này có ý nghĩa hay không phụ thuộc vào việc triển khai MyClass. Hãy nói rằng SomeAbstractClass được định nghĩa như thế này:

public abstract class SomeAbstractClass 
{ 
    public abstract string GetStuff(); 
} 

Nếu phương pháp GetStuff trong MyClass được thực hiện như thế này, bạn vẫn có thể ghi đè lên nó:

public override string GetStuff() 
{ 
    return "Foo"; 
} 

này sẽ cho phép bạn viết:

mcMock.Setup(x => x.GetStuff()).Returns("Bar"); 

vì trừ khi được niêm phong một cách rõ ràng, GetStuff vẫn là ảo. Tuy nhiên, bạn đã viết GetStuff như thế này chưa:

public override sealed string GetStuff() 
{ 
    return "Baz"; 
} 

Bạn sẽ không thể giả mạo nó. Trong trường hợp đó, bạn sẽ nhận được một ngoại lệ từ Moq nói rằng đó là ghi đè không hợp lệ của một thành viên không phải ảo (vì nó bây giờ là sealed).

0

Câu hỏi của bạn không thực sự hợp lý. Moq có thể được sử dụng để giả lập các lớp trừu tượng và các giao diện. Kể từ MyClass là không thì bạn không thể tạo ra một giả của nó. Tôi không nghĩ rằng đây là một vấn đề mặc dù, kể từ khi người tiêu dùng của trường hợp MyClass của bạn có thể sẽ mong đợi một SomeAbstractClass hoặc một trường hợp IMyClass và không phải là một ví dụ MyClass. Nếu thực sự họ mong đợi một ví dụ MyClass, thì bạn cần phải làm cho một số trừu tượng trên đầu trang của nó. Điều này có thể đạt được bằng cách có SomeAbstractClass triển khai giao diện IMyClass hoặc bằng giao diện IMyClass hiển thị các phương thức và thuộc tính của SomeAbstractClass.

+1

Tôi nghĩ câu hỏi của anh ta có nghĩa là anh ta có thể giả lập đối tượng MyClass * tương đương trong câu hỏi của mình –

+0

Không, bởi vì trong trường hợp đó câu hỏi đúng là: Tôi có thể sử dụng Moq để giả lập bất kỳ lớp cụ thể nào không ? Câu trả lời đơn giản là không. Theo như tôi biết tê giác tê giác có thể làm điều này mặc dù. –

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