单元测试C#中的void方法?
我真的想要测试每当发生一个动作时发送通知电子邮件的方法。该方法中的大部分参数都是硬编码的。喜欢电子邮件模板有参数主题,标题和正文。我的方法参数是userMailId,adminName和ControllerContext用于生成模板。单元测试C#中的void方法?
我的代码
公共无效的SendMail(ControllerContext,管理员,用户列表) { 尝试 {VAR =的templatePath的String.Empty; var subject = string.Empty; var viewModel = new EmailModel();
switch (pathid)
{
case 0:
if (pathId == 3)
templatePath = "AllCategoryTemplate";
else
templatePath = "SpecificTemplate";
break;
case 1:
templatePath = "AllTemplate";
break;
case 2:
templatePath = "CategoryTemplate";
break;
}
switch (urlId)
{
case 1:
viewModel.ItemUrl = "itemurl";
break;
case 2:
viewModel.ItemUrl = "itemurl1";
break;
case 3:
viewModel.ItemUrl = "itemurl2";
break;
default:
viewModel.ItemUrl = "itemurl23";
break;
}
foreach (var user in userList)
{
viewModel.FirstName = user.FirstName;
viewModel.LastName = user.LastName;
string bodyOftheContent = Generator.TemplateGeneration(ControllerContext,tempatePath);
Object.SendCustomMail(user.Email, bodyOftheContent, subject);
}
}
catch(Exception ex)
{
LogExtension.LogError("Error in sending notification email", ex, MethodBase.GetCurrentMethod());
}
}
不能单元测试无效的方法,但你可以做一个单元测试的无效方法部分,看是否有希望的突变的类属性已发生,在数据库中提供的输入文件或记录。
I.e.
public class SimpleEmailTest
{
private int _sentEmails;
public SimpleEmailTest()
{
this._sentEmails = 0;
}
[TestMethod]
public void TestIfEmailsGetSent()
{
SendEmail();
Assert.IsTrue(_sentEmails == 1);
}
public void SendEmail
{
// do email sending
_sentEmails++;
}
}
你是什么意思'你不能单元测试一个无效的方法'?一个void方法是一种方法,它为你编写的每一行代码都可以并且应该写一个断言。 – zaitsman
@zaitsman这正是我在我的句子的第二部分所说的。你编写了一个单元测试来检查变量或属性的预期结果,既然void方法不返回,你不能断言它的值是否正确。因此,你必须单元测试它的变化,而不是单元测试实际的方法。按照上面的例子,我不能'Assert.IsTrue(SendEmail()== 1)',但我可以'Assert.IsTrue(_sentEmails == 1' – Chrotenise
你能发布你的代码吗?你有什么版本的Microsoft Visual Studio? – zaitsman
包含此方法的类未正确设计。在单元测试中,你真的不想实际发送电子邮件。但是想要测试模板生成。你想把他们分成不同的班级。 – Wazner
@Wazner这不一定正确。阅读微软假货。你可以生成一个模板,并发送电子邮件,然后在单元测试中用电子邮件客户端替代填充,然后瞧 - 发送电子邮件发送匹配的预期模板处理。 – zaitsman