2008-09-16 21 views
6

Một trong những vấn đề lớn nhất hiện nay khiến tôi trở lại từ việc kiểm tra đơn vị hơi nước là phần lớn mã tôi viết phụ thuộc rất nhiều vào các đối tượng COM của bên thứ ba từ các nguồn khác nhau cũng có xu hướng tương tác với nhau. Tôi đang viết bổ trợ cho Microsoft Office bằng cách sử dụng một số thư viện trợ giúp nếu bạn cần biết).Làm thế nào để mã đơn vị kiểm tra tương tác với và khởi tạo các đối tượng COM của bên thứ ba?

Tôi biết tôi có lẽ nên sử dụng các đối tượng giả nhưng chính xác tôi sẽ đi về điều đó trong trường hợp này như thế nào? Tôi có thể thấy rằng nó tương đối dễ dàng khi tôi phải chuyển một tham chiếu đến một đối tượng đã tồn tại nhưng một số thói quen của tôi tự khởi tạo các đối tượng COM bên ngoài và sau đó đôi khi chuyển chúng sang một đối tượng COM bên ngoài khác từ một thư viện khác.

Cách tiếp cận thực hành tốt nhất ở đây là gì? Tôi có nên có mã kiểm tra của tôi tạm thời thay đổi thông tin đăng ký COM trong sổ đăng ký để mã thử nghiệm sẽ khởi tạo một trong các đối tượng giả của tôi thay thế không? Tôi có nên tiêm các đơn vị thư viện kiểu sửa đổi không? Có cách tiếp cận nào khác?

Tôi sẽ đặc biệt biết ơn các ví dụ hoặc công cụ cho Delphi nhưng sẽ hài lòng với lời khuyên chung hơn và các giải thích cấp cao hơn nữa.

Cảm ơn,

Oliver

Trả lời

6

Cách tiếp cận truyền thống nói rằng mã khách hàng của bạn nên sử dụng một wrapper, có trách nhiệm cho instantiating đối tượng COM. Wrapper này sau đó có thể dễ dàng chế giễu.

Vì bạn đã có các phần mã của bạn trực tiếp hóa các đối tượng COM, điều này không thực sự phù hợp. Nếu bạn có thể thay đổi mã đó, bạn có thể sử dụng mẫu nhà máy: họ sử dụng nhà máy để tạo đối tượng COM. Bạn có thể giả lập nhà máy để trả lại các vật thể thay thế.

Cho dù đối tượng được truy cập thông qua trình bao bọc hay thông qua giao diện COM ban đầu tùy thuộc vào bạn. Nếu bạn chọn giả lập giao diện COM, hãy nhớ đến công cụ IUnknown :: QueryInterface trong mô hình của bạn, vì vậy bạn biết rằng bạn đã chế nhạo tất cả các giao diện, đặc biệt nếu đối tượng sau đó được truyền cho một số đối tượng COM khác.

Hoặc, hãy xem phương thức CoTreateAsClass. Tôi chưa bao giờ sử dụng nó, nhưng nó có thể làm những gì bạn cần.

3

Nó đi xuống đến 'thiết kế cho testability'. Lý tưởng nhất, bạn không nên khởi tạo trực tiếp các đối tượng COM đó nhưng nên truy cập chúng thông qua một lớp của sự chuyển hướng có thể được thay thế bằng một đối tượng giả.

Bây giờ, COM tự cung cấp mức độ gián tiếp và bạn có thể cung cấp đối tượng giả để thay thế cho thực tế nhưng tôi nghi ngờ nó sẽ là một nỗi đau để tạo và tôi nghi ngờ nếu bạn nhận được nhiều trợ giúp từ một khuôn khổ mocking hiện có.

+0

Đồng ý; và vì tất cả tương tác với các đối tượng COM (ngoại trừ các cuộc gọi tự động thông qua IDispatch) sử dụng giao diện COM, bạn chỉ có thể thực hiện các giao diện đó trong lớp mô phỏng của mình. – rpetrich

2

Tôi sẽ viết một lớp bao bọc mỏng xung quanh đối tượng COM bên thứ ba của bạn, có khả năng nạp đối tượng giả thay vì đối tượng COM thực tế trong tình huống thử nghiệm đơn vị. Tôi thường làm điều này bằng cách có một hàm tạo thứ hai mà tôi gọi đi qua đối tượng giả. Nhà xây dựng bình thường sẽ chỉ nạp đối tượng COM như bình thường.

Các bài viết wikipedia có một giới thiệu tốt để các đối tượng Wikipedia artible

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