これは電子メール送信アプリケーションのほんの一部ですが、アプリケーションの単体テストを実装しようとしています。これまでの単体テストで少し読んだことがありますが、クラス全体ではなく単一の関数をテストするだけでよいことを理解しています。このコードをテストするにはどうすればよいですか?私の最初のUnit-test for Email-functionを書く方法
private void Send(IEnumerable<Customer> customers, string body)
{
string titleOfEmail = "Welcome as a new customer at Company!";
string ourEmailAddress = "[email protected]";
int NumberOfRetriesOnError = 2;
int DelayOnError = 10;
foreach (var customer in customers)
{
for (int i = 0; i <= NumberOfRetriesOnError; ++i)
{
try
{
Sender.Send(ourEmailAddress, customer.Email, titleOfEmail);
return;
}
catch (SmtpException e)
{
if (i < NumberOfRetriesOnError)
Thread.Sleep((i + 1) * DelayOnError);
else
Errors.Add(e.Message + customer); // Include customeremail
}
}
}
編集:情報の残りはおそらく残り
public interface IMailSender
{
void Send(string from, string to, string body);
}
sealed class NullMailSender : IMailSender
{
void IMailSender.Send(string from, string to, string body)
{
}
}
sealed class SmtpMailSender : IMailSender
{
void IMailSender.Send(string from, string to, string body)
{
System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
mail.From = new System.Net.Mail.MailAddress(from);
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("yoursmtphost");
mail.To.Add(to);
mail.Body = body;
smtp.Send(mail);
}
}
のために必要でないと、この部分は、トップ機能の残りの部分、クラス全体
public class SendingMail
{
public List<string> Errors { get; } = new List<string>();
public IEnumerable<Customer> Customers { get; set; }
public IEnumerable<Order> Orders { get; set; }
public IMailSender Sender { get; set; }
public void SendWelcomeEmails()
{
var template = Resources.WelcomeEmailTemplate;
Send(GetNewCustomers(), Resources.WelcomeEmailTemplate);
}
public void SendComeBackEmail()
{
var template = Resources.WelcomeEmailTemplate;
var emailContent = String.Format(template);
Send(GetCustomersWithoutRecentOrders(), Resources.ComeBackEmailTemplate);
}
private IEnumerable<Customer> GetNewCustomers()
{
var yesterday = DateTime.Now.Date.AddDays(-1);
return Customers.Where(x => x.CreatedDateTime >= yesterday);
}
private IEnumerable<Customer> GetCustomersWithoutRecentOrders()
{
var oneMonthAgo = DateTime.Now.Date.AddMonths(-1);
return Customers.Where(c => {
var latestOrder = Orders
.Where(o => o.CustomerEmail == c.Email)
.OrderByDescending(o => o.OrderDatetime)
.FirstOrDefault();
return latestOrder != null
&& latestOrder.OrderDatetime < oneMonthAgo;
});
}
私は少し新人ですが、勉強しようとすると、最初の部分を完全に理解しました。しかし、私たちが電子メールの部分に着いたとき、私は他のクラスのファイルによく似ていたので、混乱しました。あなたが私のことを理解する必要があるかどうかは分かりませんが、インターフェースと実装した残りのクラスの質問を編集しました。 –