c# - 如何先开发秒表类测试?

标签 c# unit-testing testing tdd test-first

我目前正在尝试实现一个 StopWatch 类。界面是这样的:

interface IStopWatch {
    void Run();
    void Stop();
    int SecondsElapsed { get; }
    int MinutesElapsed { get; }
}

基本上我的应用程序需要使用 StopWatch,但出于测试目的,最好有一种方法来人工修改 StopWatches 的结果,所以这就是我让所有代码引用 IStopWatch 而不是 .NET 的 System.Stopwatch 的原因。

当我试图开发这个测试优先时,我必须在编写测试后才为我的 StopWatch 类编写代码。我已经意识到我将要进行的测试不会是单元测试,因为我在内部使用 .NET 的 System.Stopwatch 类。

因此,据我所知,我现在唯一能做的就是如下所示的测试:

[TestMethod]
public void Right_After_Calling_Run_Elapsed_Minutes_Equals_Zero() {
    IStopWatch stopWatch = new StopWatch();
    stopWatch.Run();
    Assert.AreEqual<int>(0, stopWatch.ElapsedMinutes);
}

[TestMethod]
public void One_Second_After_Run_Elapsed_Seconds_Equals_One() {
    IStopWatch stopWatch = new StopWatch();
    stopWatch.Run();
    Thread.Sleep(1000 + 10);
    Assert.AreEqual<int>(1, stopWatch.ElapsedSeconds);
}

[TestMethod]
public void Sixty_Seconds_After_Run_Elapsed_Minutes_Equals_One() {
    IStopWatch stopWatch = new StopWatch();
    stopWatch.Run();
    Thread.Sleep(60 * 1000 + 1000);
    Assert.AreEqual<int>(1, stopWatch.ElapsedMinutes);            
}

我知道我不能像单元测试那样经常运行它,但我认为我对此无能为力。我的方法正确还是我遗漏了什么?

谢谢

编辑

所以我最终听从了 Quinn351 和 Sjoerd 的建议,编写了一些使用 DateTimes 而不是 .NET 的 Stopwatch 类的代码:

public class MyStopWatch : IMyStopWatch {
    private DateTime? firstDateTime = null;
    private DateTime? secondDateTime = null;
    private bool isRunning = false;

    public void Start() {
        isRunning = true;
        firstDateTime = DateTime.Now;
    }

    public void Stop() {
        isRunning = false;
        secondDateTime = DateTime.Now;
    }

    public void Reset() {
        firstDateTime = null;
        secondDateTime = null;
        isRunning = false;
    }

    public TimeSpan GetTimeElapsed() {
        return secondDateTime.Value.Subtract(firstDateTime.Value);
    }
}

这让我可以为两个日期创建具有 getter/setter 的其他实现,这样我就可以让 GetTimeElapsed() 返回我想要的任何内容。

最佳答案

为什么会“人为修改秒表的结果”?!如果您要修改结果,测试的全部目的是什么?

至于测试,你还应该测试 stop 方法,你应该测试秒数是否大约是分钟数的 60 倍。

您正在编写的类也可以在内部使用 StopWatch,然后根据要求修改结果(然后您可以随时返回到原始结果)。

PS:方法名要短,不能有下划线。

关于c# - 如何先开发秒表类测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540957/

相关文章:

unit-testing - 如何为 Talend 作业编写测试用例?

unit-testing - Kotlin 中的模拟扩展功能

java - 需要针对我的自动化脚本中的每个步骤合并开始时间和结束时间

java - 如何对传入的 Jersey MultiPart 请求进行单元测试处理

c# - ObservableCollection (ViewModel) 中的 MVVM ObservableCollection

c# - ASP.NET Core - 创建自定义模型验证

c# - 如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?

ruby-on-rails - 我应该使用纯单元测试还是集成测试来测试命令模式?

testing - 运行测试时如何改善控制台输出?

c# - Java 有运算符 >>> 和 <<< 这有点不同 - 请帮助