2010-05-27 3 views
7

Tôi phải viết nhiều mã liên quan đến cổng nối tiếp. Thông thường sẽ có một thiết bị kết nối ở đầu kia của dây và tôi thường tạo ra các mô hình của riêng tôi để mô phỏng hành vi của chúng.Làm cách nào để tạo một mô hình SerialPort bằng thư viện Moq?

Tôi bắt đầu xem xét Moq để trợ giúp các bài kiểm tra đơn vị của mình. Nó khá đơn giản để sử dụng nó khi bạn chỉ cần một sơ khai, nhưng tôi muốn biết nếu nó là có thể và nếu có làm thế nào để tôi tạo một giả cho một thiết bị phần cứng phản ứng khác nhau theo những gì tôi muốn kiểm tra.

Một ví dụ đơn giản:

Một trong những thiết bị giao tiếp với tôi nhận được một lệnh (di chuyển đến vị trí x), phản hồi lại một thông điệp ACK và đi đến một "di chuyển" nhà nước cho đến khi nó đạt đến vị trí đặt hàng.

Tôi muốn tạo kiểm tra nơi tôi gửi lệnh di chuyển và sau đó tiếp tục truy vấn trạng thái cho đến khi nó đạt đến vị trí cuối cùng.

Tôi muốn tạo hai phiên bản của mô hình cho hai thử nghiệm khác nhau, một trong những nơi tôi mong đợi thiết bị đạt được vị trí cuối cùng thành công và vị trí khác sẽ không thành công.

Quá nhiều câu hỏi?

Trả lời

4

Nếu bạn có giao diện cho đối tượng cổng nối tiếp trong chương trình, thì Moq có thể thực hiện điều đó bằng cách tạo đối tượng cổng nối tiếp mô phỏng (Moq phù hợp cho cả hai phần tử và mock của bất kỳ sự phức tạp nào).

Nếu bạn muốn chặn các cuộc gọi đến lớp BCL SerialPort trước khi chúng đến phần cứng (mà không phải tạo giao diện cổng nối tiếp và triển khai, cộng với triển khai thử nghiệm), thì bạn cần cái gì đó mạnh hơn. Đó là những gì Moles dành cho.

Nếu bạn thực sự mô phỏng thiết bị, thì điều này vượt quá "kiểm tra đơn vị". Ở cấp độ này, bạn có thể sử dụng com0com để thêm một cặp cổng nối tiếp ảo và viết trình giả lập cho thiết bị của bạn mà các thử nghiệm của bạn có thể trao đổi. Ở cấp độ này, nó phức tạp hơn nhiều (mặc dù không phải là không thể) để tự động kiểm tra.

+0

Có, tôi đã có ISerialDrive, một SerialPortDrive và một vài lớp MockSerialPortDrive. Tôi sử dụng SerialPortDrive cho mã sản xuất của mình và tôi sử dụng một mô hình cho từng loại thiết bị mà tôi đang thử nghiệm. Một số là khá thẳng về phía trước và có thể dễ dàng thay thế bằng một mô hình Moq, nhưng những người khác thực hiện một số mô phỏng thông minh hơn về phần cứng mà họ kết nối. –

0

Nếu bạn đang TDDing với mocks thì bạn nên để cho các bài kiểm tra của bạn xác định các đối tượng của bạn. nó đã có vẻ như bạn có một thiết kế trong tâm trí trước khi bạn đã viết bất kỳ bài kiểm tra.

thiết kế sơ bộ của bạn có:

  • lệnh gửi
  • lệnh reciever
  • Polling (không đồng bộ/đồng bộ)
  • By luỵ bạn phải có một hàm Timeout

Đó là các trách nhiệm mà SerialController của bạn phải thực hiện. Wow đó là rất nhiều để thực hiện mà không có bất kỳ thử nghiệm tại chỗ.

Bắt đầu đẹp và dễ dàng.

Hãy thử và thử nghiệm với ý tưởng 'Thời điểm có trách nhiệm cuối cùng'.

Còn cú pháp bạn định sử dụng thì sao?

Bạn có thể muốn kiểm tra này: how-to-test-reliability-of-my-own-small-embedded-operating-system

tôi cung cấp cho các liên kết đến cách Atomic Object của làm phần cứng và James Greening Blog. James có một số giấy tờ tốt về làm TDD với phần cứng (không nhớ ruby, c, và C++ công cụ. Nếu bạn làm phần cứng sau đó bạn đã chơi với c và C++ trước;)).

BTW, có vẻ khá thú vị những gì bạn đang làm.

+0

Cảm ơn câu trả lời. Tất cả những cân nhắc hợp lệ, nhưng tôi tin rằng chúng tôi đang mạo hiểm vào một cuộc thảo luận mà không phải là cốt lõi của câu hỏi của tôi. Tôi đã thử cả hai phong cách và tôi vẫn nghĩ rằng có một số thiết kế trước khi thử nghiệm là có lợi nhưng tôi thấy cả hai bên. Câu hỏi của tôi mặc dù là cụ thể hơn hướng tới cách sử dụng Moq để làm điều gì đó tôi hiện đang làm bằng tay. –

+0

@Padu - Tôi nghĩ nhận xét của bạn về @Stephen củng cố quan điểm của tôi '... nhưng những người khác thực hiện một số mô phỏng thông minh hơn'. Mocking không nên mô phỏng * thông minh hơn *. Đó là lý do tại sao tôi đã cố gắng để chỉ ra rằng kịch bản thử nghiệm của bạn có quá nhiều đang xảy ra để có hiệu quả sử dụng một khuôn khổ giả. – Gutzofter