阻止线程的单元测试方法



在等待某些东西并阻塞线程的方法上进行 UnitTest 的最佳方法是什么? 我想测试该方法是否调用另一个方法,但显然测试永远不会结束,因为线程等待另一个事件。我正在使用 C#、xUnit 和 Mock 我想出了在调用该方法以结束块时用模拟抛出异常的想法。另一个想法是使用超时,但这听起来也不对。 在这种情况下,您认为哪些良好做法?

[Fact]
public void Connect_ConnectAsync_MethodCalled()
{
// Arrange
var socketMock = new Mock<IHsmsSocket>();
socketMock.Setup(x => x.ConnectAsync(It.IsAny<SocketAsyncEventArgs>())).Throws(new Exception("Method called"));
int bufferSize = 5000;
int port = 5000;
IPAddress ip = IPAddress.Parse("0.0.0.0");
SocketClient client = new SocketClient(socketMock.Object, bufferSize);
IPEndPoint endPoint = new IPEndPoint(ip, port);
Exception ex = new Exception("Not called");
// Act
try
{
client.Connect(endPoint);
}
catch (Exception e)
{
ex = e;
}
// Assert
Assert.Equal("Method called", ex.Message);
// Clean up
client.Dispose();
}

就个人而言,我会像您在示例中所做的那样抛出特定的异常。 这是最简单的正确方法,对于任何测试读者来说也是最明显的。

虽然超时也可以正常工作,但它会产生相同的效果,但实际上只会增加运行测试所需的时间。

测试的读者可能想知道为什么首先使用超时。 可能不清楚为什么使用特定的间隔来等待完成。

我也宁愿不抛出System.Exception而是抛出一个特定的自定义异常,如DummyException,以明确它纯粹是为了测试,与方法调用背后的实际行为无关。

而不是你的尝试捕获块,我也更喜欢这个,但这是个人喜好。

var ex = Assert.Throws<DummyException>(action);
Assert.Equal(ex.Message, "Method called");

最新更新