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
).
Nguồn
2009-12-29 07:52:38
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 –
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ù. –