c# - 根据实时值进行或退出单元测试的正确方法

标签 c# visual-studio unit-testing mstest

我有一个类检查当前星期是否是星期三。它看起来像这样:

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/

相关文章:

c# - 计算两个计时器值之间的平均值

无法完成国际象棋 table 上马的所有可能走法

c++ - 我是C++的初学者。我在Visual Studio 2019(c++ 17)中研究它,我已经在.h文件中定义了一个类,但是在另一个.h文件中我无法使用它

java - 如何使用 Mockito 对依赖于 equals() 的抽象类方法进行单元测试?

c# - 单元测试和 Entity Framework

C# - Process.Start ClickOnce 应用程序?什么网址?

c# - 如何使用c#检查当前URL是否有子域名?

c# - WER 报告的神秘 IL 偏移量

c++ - 有没有办法让用户输入来定义 Visual Studio 中的数组大小?

javascript - 引用错误: d3 is not defined in jest Unit Test