2008-12-15 27 views
5

Tôi đang làm việc trên một dự án có nhiều dịch vụ nhắn tin bên ngoài. Một cách hay để mô tả nó chỉ bằng một "hyperbolas" hơi là một ứng dụng mà hệ thống phải gửi các thông điệp tới Flicker API, API Facebook và API Netflix.Sử dụng các đối tượng giả ngoài thử nghiệm, thực hành không tốt?

Để hỗ trợ các tình huống bị ngắt kết nối, ghi nhật ký, khả năng sử dụng của nhà phát triển, cấu hình, v.v ... Tôi đã thử nghiệm bằng cách sử dụng phương pháp sử dụng rất nhiều cây thông thường và cây biểu thức. Kết quả cuối cùng trông như thế này:

Messenger<NetflixApi>.SendCustom(netflix => netflix.RecommendMovie("my message")); 

Nói chung tôi hài lòng với kết quả cuối cùng nhưng cảm thấy như tôi đã thực hiện một sai lầm, hoặc bị bỏ qua một nơi nào đó thiết kế chủ yếu liên quan đến kiểm tra và các tình huống bị ngắt kết nối.

Trong khi thử nghiệm, cho dù tự động, đơn vị hay dựa trên con người, tôi đã triển khai một nhà máy đối tượng sử dụng DI để thực hiện hành động chính xác trong "Chế độ trực tiếp" và sử dụng Mocks để cung cấp một loại sứ giả vô trùng t làm gì cả khi ở chế độ thử nghiệm.

Tôi chỉ nhìn thấy hoặc đọc về Mocks đang được sử dụng ở chế độ thuần túy TDD và không được sử dụng để sắp xếp một đối tượng câm. Các phương pháp tôi đã thấy sẽ xoay quanh việc sắp xếp hoặc nhô ra chức năng giao tiếp HTTP mà tất cả các API tôi đang sử dụng phụ thuộc vào.

Mối quan tâm chính của tôi là tất cả các dịch vụ khác nhau mà tôi mong muốn kết nối với tôi sẽ phải thực hiện nhiều công việc chi tiết thay thế việc triển khai HTTP cụ thể và nếu tôi sử dụng phương pháp tiếp cận sơ khai, tôi sẽ có 3 lớp mỗi dịch vụ này (IService, ConcreteService, StubService) và duy trì các dịch vụ đó khi triển khai một phương thức mới hoặc thay đổi bất kỳ thứ gì sẽ là PITA thực.

Trong triển khai hiện tại, tôi đang sử dụng Mocks để nhận "chế độ vô trùng" miễn phí hầu như không cần phải thực hiện thêm bất kỳ thứ gì chỉ để phù hợp với một hiệu trưởng thử nghiệm nhất định.

Câu hỏi đặt ra là tôi thiếu gì đó? Tôi đã vi phạm một hiệu trưởng thiết kế bằng cách sử dụng Mocks một cách thuận tiện hơn ...?

Ai có thể đưa ra lời khuyên nào về cách lấy chế độ vô trùng từ nhiều dịch vụ bên ngoài khác nhau mà không phải nhảy qua nhiều vòng?

Câu hỏi này có hợp lý không?

Cảm ơn tất cả các câu trả lời.

Chỉnh sửa # 1:

Tôi không rõ ràng trong câu hỏi ban đầu của mình. Bất kỳ đối tượng null hoặc giả nào đều được sử dụng hoàn toàn trong môi trường phát triển/gỡ lỗi/thử nghiệm. Trong quá trình sản xuất, mã gửi các thông điệp này sẽ là việc triển khai thực tế chúng.

Tôi đã bỏ phiếu cho mọi người vì có vẻ như có rất nhiều giải pháp khác nhau cho vấn đề này và tôi sẽ khám phá từng vấn đề.

Vui lòng không nghĩ rằng câu hỏi này đã được trả lời, tôi đánh giá cao nhiều lời khuyên nhất có thể.

Trả lời

6

Có một mẫu thiết kế có tên là Null Object. Một đối tượng null là một đối tượng thực hiện một Giao diện, vì vậy nó có thể được sử dụng trong một kịch bản giống như của bạn.

Điều quan trọng về đối tượng Null là KHÔNG trả lại giá trị null ở những nơi có thể phá vỡ hệ thống.

Mục đích của đối tượng Null là có khoảng trống và thực hiện đơn giản một thứ gì đó, giống như một mô hình, nhưng được sử dụng trong môi trường sản xuất.

Các ví dụ đơn giản nhất là một cái gì đó như thế này:

class Logger{ 
private static ILogger _Logger; 

static Logger(){ 
    //DI injection here 
    _Logger = new NullLogger(); //or 
    _Logger = new TraceLogger(); 
} 
} 

interface ILogger{ 
void Log(string Message); 
} 

internal class TraceLogger:ILooger{ 
public void Log(string Message){ 
    //Code here 
} 
} 

internal class NullLogger{ 
public void Log(string Message){ 
    //Don't don anything, in purporse 
} 
} 

Tôi hy vọng điều này có thể giúp bạn

+0

Lần thứ hai tôi thấy chủ đề của chủ đề này, một cảnh báo "Đối tượng Null" màu đỏ đã bật ... – abyx

4

Tôi nghĩ bạn có thể cần làm rõ câu hỏi của mình. Tôi không rõ liệu bạn có đang nói về việc sử dụng thử nghiệm tăng gấp đôi trong thử nghiệm mà không có kỳ vọng hay thử nghiệm (vì vậy sử dụng chúng làm giả để đáp ứng các giao diện bắt buộc) hoặc cho dù bạn đang nói về việc sử dụng mocks trong kịch bản sản xuất để điền vào dịch vụ không có sẵn (kịch bản bị ngắt kết nối của bạn).

Nếu bạn đang nói về trong các tình huống thử nghiệm: Mocks là thử nghiệm tăng gấp đôi. Không có gì sai khi thử nghiệm bằng cách sử dụng hàng giả như trái ngược với mocks hoặc cuống. Nếu bạn không cần sử dụng dịch vụ trong một thử nghiệm cụ thể và nó chỉ ở đó để cung cấp một giao diện nhất định mà đối tượng đang thử nghiệm có một sự phụ thuộc vào thì nó tốt. Điều đó không vi phạm bất kỳ hiệu trưởng thử nghiệm nào.

Thư viện mô phỏng tốt đang làm mờ các dòng giữa mocks, cuống và hàng giả.

Hãy xem một số thông tin từ Martin Fowler về các loại kiểm tra khác nhau. Mocks Aren't Stubs, TestDoubles.

Tôi thực sự thích cách mà moq cho phép liên tục giữa các đối tượng giả, giả, sơ khai và giả mà không cần phải nhảy qua các vòng để có được các hành vi cụ thể. Check it out.

Nếu bạn đang nói về việc sử dụng mocks trong kịch bản bị ngắt kết nối để sử dụng sản xuất ... Tôi sẽ lo lắng. Giả mạo sẽ trả về các đối tượng null hoặc các giá trị mặc định cho bất kỳ cuộc gọi nào bạn thực hiện. Điều này sẽ làm rò rỉ sự phức tạp trong tất cả các mã tiêu thụ các dịch vụ này (chúng sẽ cần phải xử lý việc kiểm tra các giá trị trả về null và các mảng trống ...). Tôi nghĩ rằng nó sẽ có ý nghĩa hơn cho kịch bản bị ngắt kết nối/vô trùng của bạn để được mã hóa để xử lý rằng bản thân các phụ thuộc không có sẵn thay vì chấp nhận việc triển khai mô hình của chúng và tiếp tục như thể mọi thứ đang hoạt động.

4

Nghe có vẻ với tôi như bạn có thể muốn có một cái nhìn tại các mô hình proxy. Bạn muốn một cái gì đó hoạt động giống như các dịch vụ khác nhau ngay cả khi bị ngắt kết nối khỏi các dịch vụ thực tế. Vì vậy, mã của bạn sẽ tốt hơn khi nói chuyện với một proxy thay vì thực tế. Sau đó, proxy có thể làm bất cứ điều gì cần thiết tùy thuộc vào trạng thái kết nối hiện tại.

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