Có đúng là những cái cuống Rhino Mocks và mocks chỉ tốt cho các giao diện, không phải là các lớp cụ thể? Tôi đã dành khá nhiều thời gian để làm cho đoạn mã này hoạt động. Tôi không mong đợi pubSubClient bị bướng bỉnh luôn gọi phương thức Send từ lớp. Phương thức đó có một số phụ thuộc và ném ngoại lệ.Rhino Mocks stubs và mocks chỉ tốt cho giao diện?
[Test]
public void Test01()
{
PubSubMessage psm = new PubSubMessage();
var pubSubClient = MockRepository.GenerateStub<PubSubClient>();
pubSubClient.Stub(x => x.Send(psm)).IgnoreArguments().Return(null);
// actual PubSubClient Send method throws exception
// the rest of the test is skipped...
}
Tuy nhiên, khi tôi trích xuất giao diện và chạy thử nghiệm tương tự với IPubSubClient, có vẻ như nó hoạt động như mong đợi.
Điều đó có nghĩa là tôi phải trích xuất giao diện cho mọi lớp học mà tôi muốn giả lập/làm tê liệt với tê giác? Hoặc tôi thiếu một cái gì đó, kỹ thuật hay khái niệm?
CẬP NHẬT: OK, Có vẻ như tôi đã tìm ra phần nào tôi nhớ da diết: Rhino Mocks không thể đánh chặn các cuộc gọi đến các phương pháp không ảo. Vì vậy, tôi đoán tôi có hoặc là sử dụng giao diện hoặc thực hiện mọi phương pháp trên lớp bê tông ảo. Vui lòng sửa tôi nếu có tùy chọn khác.
Nếu bạn tuyên bố rằng một phần mocks không phải cho một cái gì đó nó là hữu ích hơn để nói những gì họ đang có trong phản ứng của bạn. Một phần mocks được dự định để mô phỏng chỉ một phần của một lớp, điều này làm cho chúng tiện dụng (và cần thiết) để thử ra một lớp trừu tượng, nơi một mô hình bình thường không thể xử lý này. Điều này cho phép thử nghiệm các phương thức trừu tượng. Một giả lập một phần (ít nhất là trong Rhino) sẽ giả lập bất kỳ lớp nào và không bị giới hạn trong các lớp Abstract, tuy nhiên hãy lưu ý nếu có mã thực thi sẽ được gọi khi trả về. –
(cảnh báo necro): Tôi vừa phát hiện ra lớp học của bạn thậm chí không cần phải trừu tượng để tạo các phương thức ảo! Một điều nhỏ như vậy, nhưng tôi chưa bao giờ xem xét nó trước đây :-) – Heliac