2010-05-26 53 views
6

Tôi bắt đầu với thử nghiệm đơn vị và cố gắng thực hiện một số TDD. Tôi đã đọc một chút công bằng về chủ đề và viết một vài bài kiểm tra. Tôi chỉ muốn biết nếu sau đây là cách tiếp cận đúng.Tôi nên kiểm tra đơn vị gửi email từ bộ điều khiển như thế nào?

Tôi muốn thêm cơ sở "liên hệ với chúng tôi" thông thường trên trang web của mình. Bạn biết điều đó, người dùng điền vào một biểu mẫu với địa chỉ email của họ, nhập một thông điệp ngắn gọn và nhấn một nút để đăng biểu mẫu trở lại.

Chất kết dính mô hình thực hiện công cụ của họ và phương pháp hành động của tôi chấp nhận dữ liệu được đăng dưới dạng mô hình. Phương thức hành động sau đó sẽ phân tích cú pháp mô hình và sử dụng smtp để gửi email tới quản trị viên trang web để họ truy cập vào biểu mẫu liên hệ trên trang web của họ.

Bây giờ cho câu hỏi .... Để kiểm tra điều này, có thể tôi là đúng trong việc tạo ra một giao diện IMessageService rằng có một phương pháp Gửi (EMAILADDRESS, tin nhắn) để chấp nhận các địa chỉ email và nội dung thư. Thực hiện các inteface trong một lớp bê tông và để cho rằng lớp đối phó với các công cụ smtp và thực sự gửi thư.

Nếu tôi thêm giao diện làm tham số cho hàm tạo bộ điều khiển của mình thì tôi có thể sử dụng DI và IoC để chèn lớp bê tông vào bộ điều khiển. Nhưng khi thử nghiệm đơn vị tôi có thể tạo phiên bản giả hoặc giả của IMessageService và thực hiện các xác nhận về điều đó.

Lý do tôi hỏi là tôi đã thấy các ví dụ khác về những người tạo giao diện cho SmtpClient và sau đó chế nhạo điều đó. Có thực sự cần phải đi xa hay tôi không hiểu công cụ này?

Trả lời

2

Bạn vẫn cần phải kiểm tra lớp học của mình để gọi trình gửi thư. Tôi đề nghị rằng bạn có thể muốn làm một chút của cả hai. Tôi thường tạo một giao diện IMailClient và một trình bao bọc xung quanh SmtpClient thực hiện giao diện. Sử dụng (và tiêm) giao diện trong một lớp proxy biết cách xây dựng thông báo và gửi nó (nó có thể có một số phương thức kiểu nhà máy có thể xây dựng nhiều loại thông điệp khác nhau). Các shim xung quanh SmtpClient thực sự nên được chỉ rằng, do đó có rất ít nhu cầu cho các đơn vị thử nghiệm nó. Bạn có thể giả mạo shim của bạn khi kiểm tra lớp proxy và giả lập lớp proxy của bạn khi kiểm tra các bộ điều khiển của bạn.

+0

Tôi đồng ý và có thể sẽ hữu ích ngay khi bạn cần IMailClientAsync mà bạn có thể trao đổi. – Hal

1

Aproach bạn mô tả đã hoạt động tốt cho tôi trong quá khứ. Tôi đã làm việc trên một dự án giao tiếp với API dịch vụ web MS Dynamics CRM. Tôi muốn đơn vị kiểm tra mã của tôi nhưng tôi không có mong muốn đơn vị kiểm tra dịch vụ web. Tôi đã làm theo quy trình chính xác mà bạn mô tả nhưng với dịch vụ web được giả mạo thay vì gửi thư. Nó hoạt động rất tốt.

1

Bạn đang đi đúng hướng, đó là phương pháp bạn nên sử dụng. Có lẽ là những ví dụ bạn đang đề cập đến, là mọi người đang đi vào nó theo cách khó/sai ... hoặc là ví dụ về cách bạn có thể xử lý một cơ sở mã kế thừa lớn.

Tiêm cơ chế để gửi thư linh hoạt và dễ dàng sử dụng lại trong các trường hợp khác. Một kịch bản như vậy là chẩn đoán, nếu bạn có một máy chủ dev, bạn có thể không muốn nó được đánh thư tất cả các thời gian, bằng cách chuyển đổi lớp tiêm bạn có thể có nó đầu ra vào một tập tin hoặc chỉ đơn giản Debug.Write.

ps. bạn vẫn được đề nghị kiểm tra lớp SmptDeliver của bạn, nhưng đó sẽ là bài kiểm tra tích hợp tập trung mà bạn có thể thực hiện trên lớp đó một cách độc lập với phần còn lại của mã.

1

Tôi nghĩ rằng bạn đang đi đúng hướng. Đừng lo lắng về máy chủ smtp hay bất cứ thứ gì khác. Chỉ cần kiểm tra đơn vị những gì bạn cần. Hãy để các bài kiểm tra cho bạn biết những gì bạn cần.Khi bạn nhận được kiểm tra thực tế Send(emailAddress, message), sau đó bạn có thể lo lắng về cách bạn sẽ thực sự gửi tin nhắn cho quản trị viên.

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