阻塞线程的单元测试方法

问题描述 投票:0回答:1

被认为是在等待某些东西并阻塞线程的方法上进行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();
    }
c# unit-testing mocking xunit
1个回答
0
投票

我个人会像在您的示例中一样抛出一个特定的异常。这是正确的最简单方法,也是任何测试读者最明显的方法。

虽然超时同样有效,但效果相同,但实际上只是增加了运行测试所需的时间。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.