gpt4 book ai didi

c# - 由于 'System.DateTime' 准确度,成组运行时单元测试运行速度过快

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:53 27 4
gpt4 key购买 nike

我正在运行一个很大的单元测试列表,这些单元测试正在检查各种不同的类获取和设置。我遇到了一些错误,因为我的测试运行太快?!?

举个简单的例子,单元测试从模拟一个带有评论的博客开始;

Blog b = new Blog("Comment");

这会设置博客中新评论的添加日期时间。然后我正在测试向博客添加评论;

b.addComment(comment);

在测试结束时,我断言使用以下内容添加测试;

Assert.AreEqual(x, b.Comments.OrderByDescending(x => x.CreatedDate).First().Comment;

就目前而言,这在隔离运行时通过。但是,当测试在一组测试中运行时,这将失败,因为两个注释具有完全相同的日期时间。值得注意的是以下将通过仅因为它将按默认顺序排序;

Assert.AreEqual(x, b.Comments.OrderBy(x => x.Created).Last().Comment;

我最初的想法是它怎么会失败? DateTime.Utc 有一个 ticks 函数,精确到百万分之一秒。经过一些研究,我发现系统日期时间只能精确到 10-15 毫秒,所以这是我的问题。

我的问题是,最好的解决方案是什么?

我可以将 Thread.Sleep(20); 添加到每个测试,但如果我运行 1000 个测试,现在是 20 秒?其他人是如何解决这个问题的?

最佳答案

您的类(class)依赖于外部资源,即当前系统时间。因此,您不是孤立地测试类(class),这会给您带来问题。您应该模拟 DateTime.Now(一些单元测试框架允许模拟静态成员 - 例如 JustMock ),或者创建抽象依赖项,这将为您的类提供时间:

public interface ITimeProvider
{
DateTime CurrentTime { get; }
}

正如 Mark Seemann 所建议的那样 here ,您可以使用此抽象的静态实例来避免将此依赖项传递给需要获取当前时间的每个类,但这会使依赖项隐含(因此由您决定采用哪种方式):

public class TimeProvider : ITimeProvider
{
private static ITimeProvider _instance = new TimeProvider();

private TimeProvider() { }

public static ITimeProvider Instance
{
get { return _instance; }
set { _instance = value; } // allows you to set mock
}

public DateTime CurrentTime
{
get { return DateTime.Now; }
}
}

使用起来很简单

var date = TimeProvider.Instance.CurrentTime;

关于c# - 由于 'System.DateTime' 准确度,成组运行时单元测试运行速度过快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21907471/

27 4 0
文章推荐: python - 属性错误: module 'cv2' has no attribute 'face' (OpenCV and Python)
文章推荐: python - 当一只正在移动的 Python turtle 靠近另一只 turtle 时,阻止它
文章推荐: python - 从 scikit-learn 导入 make_blobs
文章推荐: c# - 使用 Action 作为方法输入