【发布时间】:2019-11-25 02:12:17
【问题描述】:
我正在尝试测试在设定的时间(在我的情况下为 1300 毫秒)后调用 SendMessage 将在事件处理程序中给出正确的结果。但是Thread.Sleep(1300) 并没有等待 1300ms,它只等待了大约 300ms。
单元测试
using System;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using mvce;
namespace mvceTest
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Class1 c = new Class1();
string finalResult = "";
c.AnEvent += (o, entry) => { finalResult = entry; };
DateTime start = DateTime.Now;
while (finalResult == "")
{
Thread.Sleep(1300);
c.SendMessage("message");
}
DateTime end = DateTime.Now;
Assert.AreEqual(1300, (end - start).Milliseconds);
Assert.AreEqual("message", finalResult);
}
}
}
类 1
using System;
namespace mvce
{
public class Class1
{
private readonly object _lock = new object();
private event EventHandler<string> _anEvent;
public event EventHandler<string> AnEvent
{
add
{
lock (_lock)
{
_anEvent += value;
}
}
remove
{
lock (_lock)
{
_anEvent -= value;
}
}
}
public void SendMessage(string message)
{
_anEvent?.Invoke(this, message);
}
}
}
我得到的输出是
Assert.AreEqual 失败。预期:。实际:。
显然我不希望它们相等,这只是为了举例。
我也尝试过System.Threading.Tasks.Task.Delay(1300).Wait();,但得到了相同的结果。
如何让测试线程等待正确的时间?为什么Thread.Sleep 不起作用?
【问题讨论】:
-
你是如何衡量
~300ms的? -
@SeM 这是断言告诉我的。
-
@MattEllen 这可能是XY problem。您真正想要实现的目标是什么?
-
@Nkosi 我必须测试事件的结果是否会受到调用
SendMessage所需时间的影响。 -
@MattEllen 那么我建议您编辑问题以澄清这一点。如果说得清楚,你会得到更好的回应。现在您更多地关注
Thread.Sleep问题,这会将注意力从实际问题上移开。提供minimal reproducible example
标签: c# .net unit-testing events thread-sleep