我有一个类检查当前星期是否是星期三。它看起来像这样:
public class Wednesday
{
public string IsWednesday()
{
if (DateTime.Now.DayOfWeek == DayOfWeek.Wednesday)
{
return "It’s Wednesday";
}
else
{
return "It’s not Wednesday";
}
}
}
不用担心返回类型,我知道在这个特定示例中返回魔术字符串是不好的。我们专注于其目的,而不是实现。
我很乐意通过单元测试来覆盖当前工作日是星期三和除星期三以外的任何情况。
我是单元测试新手,我想知道此示例中的最佳解决方案是什么。
现在,我正在使用 VS2019 和 MS Test V2。我已经测试了这两种情况:
[TestClass]
public class WednesdayTests
{
[TestMethod]
public void IsWednesday_CurrentWeekDayIsWednesday_ReturnsItsWedndesday()
{
if (!(DateTime.Now.DayOfWeek == DayOfWeek.Wednesday))
{
return;
}
// Arrange
Wednesday wednesdayObj = new Wednesday();
// Act
string result = wednesdayObj.IsWednesday();
// Assert
Assert.AreEqual("It’s Wednesday", result);
}
[TestMethod]
public void IsWednesday_CurrentWeekDayIsNotWednesday_ReturnsItsNotWednesday()
{
if (!(DateTime.Now.DayOfWeek != DayOfWeek.Wednesday))
{
return;
}
Wednesday wednesdayObj = new Wednesday();
string result = wednesdayObj.IsWednesday();
Assert.AreEqual("It’s not Wednesday", result);
}
}
当某些条件不满足时,是否可以从测试方法中返回(就像我的情况一样)?
或者我的解决方案有本质上的错误吗?
很高兴听到经验丰富的软件开发人员的任何建议!
附注只是注意到只有在实际上是星期三时才会进行测试:)哇,这肯定不是解决方案!
最佳答案
单元测试的基本原则之一是它应该是可重复的和独立的。 你的,按原样,不是。
根据当前日期制作可单元测试方法的一种方法是为它们提供恒定的“现在”值(由测试运行程序提供的值)。
public string IsWednesday() => IsWednesday(DateTime.Now);
public string IsWednesday(DateTime time)
{
if (time.DayOfWeek == DayOfWeek.Wednesday)
{
return "It’s Wednesday";
}
else
{
return "It’s not Wednesday";
}
}
然后您可以使用固定日期运行测试,涵盖“星期三”和“非星期三”两种情况。这种方法是一般策略的一个示例:环境正常执行期间提供的任何内容(机器名称、日期、文化等)都应该是被测方法中的参数,并且测试平台应该提供一系列重要值.
关于实际测试(如果可以的话,帮自己一个忙,使用 NUnit 或 XUnit):它们变得微不足道。
[TestMethod]
public void ItsNotWednesday()
{
var wednesdayObj = new Wednesday();
var result = wednesdayObj.IsWednesday(new DateTime(2019, 10, 5)); // Not a wednesday
Assert.AreEqual("It’s not Wednesday", result);
}
关于c# - 根据实时值进行或退出单元测试的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58249734/