Gởi mail cho nhiều người theo một template có sẵn. Template chứa nội dung mail và cho phép định nghĩa các field. Tùy theo thông tin từng người, giá trị các field sẽ được thay thế. Nó giống với tính năng mail megre của Word.
Template được lưu trữ theo định dạng xml.
Chương trình dùng thư viện mail có sẵn của .net framework. Vì vậy, không cần phải test khả năng gởi mail đến địa chỉ nhận. Công việc test tập trung vào tính đúng đắn của việc merge.
Mong muốn như sau
public void TestMailMerge()
{
User foo = new User("foo", "foo@bar.com");
Queue mailQueue = new Queue();
Emailer emailer = new emailer(foo)
emailer.SmtpClient = new MockSmtpClient(mailQueue);
emailer.Send();
MailMessage message = mailQueue.Dequeue();
Assert.AreEqual("foo@bar.com", message.To);
// others asserts
}
Ham Emailer.Send() thưc hiện việc merge và sau đó ủy thác cho SmtpClient gởi đi. Trong trường hơp này, ta không cần lá thứ được gởi đến người nhận. Ta cần lấy đối tượng MailMessage để assert việc merge thực hiện đúng.
Tuy nhiên, thật thất vọng không thể thừa kế MockSmtpClient được vì hàm Send không cho phép override :(.
Tôi giải quyết bằng cách thêm hàm Merge cho Emailer và đặt nó là
internal để có thể test. Tuy nhiên, vì emailer được dùng trong các method khác. Và vì vậy, khi chạy các bộ test, Smtp host và port vẫn bắt buộc cung cấp. Kết quả là môi trường phải được setup và bộ test bị lệ thuộc quá nhiều. Điều này không hay tí nào.
No comments:
Post a Comment