Soru Bir birim posta gönderme işlevini nasıl test ediyor?


Bir rapor oluşturan ve onu bir kullanıcıya gönderen bir fonksiyonum var. Yaptığım şey, e-posta işlevi için bir alay oluşturmak ve e-posta sınıfının 'gönder' işlevinin çağrılıp çağrılmadığını doğrulamaktır.

Şimdi fonksiyonun çağrıldığını biliyorum, ancak Send () işlevinin gövdesini nasıl test ediyorsunuz? Konunun ve vücudun doğru olduğunu ve e-postaya ekin nasıl olduğunu kanıtlayabilirim?


25
2018-06-17 06:45


Menşei


sourceforge.net/projects/mockemail - Jeremy Thompson
Biraz kod verebilir misiniz? Gönderme Yöntemi neye benziyor? - WaltiD
Ayrıca, virüs denetleyicisi e-posta sunucusuna giden e-postaları engelleyen bir virüs denetleyicisi gibi, test makinesindeki virüs denetleyici ayarlarını değiştirmeniz gerektiğini de görebilirsiniz. - Ian Ringrose


Cevaplar:


Aşağıdaki şekillerde yapılabilir.

1. Adım: adresine gidin Web.Config dosyaya ekleyin ve aşağıdaki etiketleri ekleyin.

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="E:\MailTest\"/>
        </smtp>
    </mailSettings>
</system.net>

Alma konumu için belirttiğiniz dizinin mevcut olduğundan emin olun.

2. Adım: Şimdi e-posta gönderme işlevinizi test edin. Kullandım button_click Bu işlevi aşağıdaki kodla sınamak için.

SmtpClient smtp = new SmtpClient();
MailMessage message = new MailMessage("me@gmail.com", "me@yahoo.com","My Message Subject","This is a test message");
smtp.Send(message);

Çıktı: Yaratacak .eml klasörü, randonly oluşturulan bir GUID adıyla birlikte alır; bu, aldıktan sonra görebildiğimiz e-postadır. Benim için böyle bir dosya oluşturdu c127d1d5-255d-4a5a-873c-409e23002eef.eml içinde E:\MailTest\ Klasör

Bu yardımcı olur umarım :)


30
2018-06-17 07:34



Bu aslında çok güzel bir çözüm. Çalışacağına inanmadım demeliyim ama ... - Michel
Bu, e-posta göndermesi gereken bir web uygulaması için otomatik testler oluştururken harika bir çözümdür. Test.com veya example.com e-posta sunucularından reddedilen e-postalar yok! +1 - Greg Burghardt
Güzel bir çözüm olabilir ama bu bir birim testi değil. - CodingYoshi


Ünite testinizde alay çerçevenizi bir çağrı beklemesini söyleyin. Send() belirli bir gövde metni ile.

Rhino Mocks için örnek:

var mockMail = MockRepository.GenerateMock<Mail>();
mockMail.Expect( m => m.Send("ExpectedFrom", "ExpectedTo", "ExpectedSubject", "ExpectedBodytext") );

mockMail.Send(...whatever...);

mockProvider.VerifyAllExpectations();

12
2018-06-17 07:29





Son zamanlarda bu konuya kendim girdim. Kullanmayı deneyin http://netdumbster.codeplex.com/. Bu kütüphane, yerel bir SMTP sunucusunu açıp aldığınız e-postaları kontrol etmenizi sağlar. Tüm bunlar AFAIK hafızasında ele alındığı için testiniz üzerindeki perfomance etkisi minimum düzeyde olmalıdır.

Testinizde böyle bir sunucu yaratıyorsunuz

SimpleSmtpServer server = SimpleSmtpServer.Start(25);

Ardından, yerel smtp sunucusunu kullanmak için posta gönderen sınıfınızın yapılandırmasını değiştirin (localhost: 25). Posta gönderildikten sonra buna benzer şekilde erişebilirsiniz

server.ReceivedEmail[0]

Konu, gövde ve ekleri kontrol etmek için Data veya MessageParts özelliğini kullanın.

Umarım bu yardımcı olur.


8
2018-06-17 07:51



NDumbster'ı denedim ve işe yaradı, ama benim durumumda, 10 saniyede basit bir test <10ms patladı. Sadece yapılandırmam olsa da olmasın. - Jafin
e-postayı e-posta ile göndereyim, böylece sahte sunucum bunu alsın mı? - Mortalus


En azından benim durumumda, tüm e-posta gönderme bir 'MailService' sınıfında kapsüllenmiş ve tüm çağrıları sınıftaki bir gönderim yönteminden geçirir. Gönderme yöntemi sanal - ve tüm yaptığı bir SmtpClient kadar yeni, posta göndermek, vb Benim birim testleri için, özel bir MailServiceMock var, bu geçersiz kılar ve hiçbir şey yapmaz. Diğer tüm yöntemler test edilebilir - ancak gönderim kısa devrededir.

oleschri, Rhino Mocks kullanarak bunu yapmanın daha kolay bir yolunu sağladı (bence herhangi bir alay çerçevenin işe yarayacağını düşünüyorum) - ancak başka bir bağımlılık getirmekte tereddüt ediyorsanız, bu ayaklarınızı elle alay ederek ıslatabilir.


1
2017-11-04 13:57





E-posta içeriğini onay testlerinde (www.approvaltests.com) veya nuget'de test etmek için çok basit bir yol var.

Kod basitçe:

 EmailApprovals.Verify(mail);

Bu .eml dosyasını oluşturacak ve sonucu görünümde görmenize izin verecektir. Gelecek. Ayrıca, sonucu onayladıktan sonra (dosyayı .approved olarak yeniden adlandırın), test Outlook'u açmadan geçer.

Süreç hakkında kısa bir video hazırladım ve yükledim Youtube.


1
2018-04-27 06:01





Geçmişte gerçek e-postalar gönderdim ancak varsayılan EMailGateway uygulamasında dekoratör modelini kullandım.

Bu yüzden, alıcımı kendi adresime değiştirecek bir EMailGatewayRedirect'i vardı ve benim durumumda, e-postanın bir test olduğunu ve orijinal alıcı adresinin ne olduğunu belirten bir satır ekledim.

DI kapsayıcı kullandığım için, entegrasyon testlerimde IEMailGateway uygulamam olarak yönlendirme ağ geçidini basitçe başlattım. Bu şekilde gerçek bir e-posta gönderildi.


0
2018-06-17 08:16



Kurulumu yanlış yapana ve 1001 test e-postası gerçek insanlara ulaşıncaya kadar tamam! (Bu problemi hiç görmemiştim ....) - Ian Ringrose
Büyük güç büyük sorumluluk getirir! lol --- sadece yapılandırma yanlış almayın;) - Eben Roux