这听起来可能很愚蠢,但是我无法捕捉到ExtendedSocketException
抛出的SocketTaskExtensions.ConnectAsync()
。
完整的名称空间是:System.Net.Internals.SocketExceptionFactory.ExtendedSocketException
编译器抱怨Cannot resolve symbol 'ExtendedSocketException'
。我的班级库和测试项目都针对.Net Core 2.1。
也没有可以添加的参考或Nuget包。至少我找不到任何东西... https://docs.microsoft.com上似乎也什么也没有...
我在这里做什么错了?
[Fact]
[Trait("Category", "UnitTest")]
public async Task Should_Throw_Exception_If_Port_Unreachable()
{
// Arrange
var client = new TcpConnector();
var nonListeningPort = 81;
var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), nonListeningPort);
// Act & Assert
var connectTask = client.ConnectAsync(endpoint);
Func<Task> func = async () => { await connectTask; };
func.Should().Throw<ExtendedSocketException>();
}
答案 0 :(得分:0)
ExtendedSocketException
是private
类,因此您不能在.NET内部框架之外引用它。但是,您可以捕获SocketException
并检查异常消息。
答案 1 :(得分:0)
即使ExtendedSocketException
是私有的,也肯定会被公开:
另一方面,它是从SocketException
继承的,因此我们不必太在意它。
就您的测试而言,我认为您应该能够将断言修改为类似于以下内容的内容:
var exception = Assert.Catch(func);
Assert.IsInstanceOf<SocketException>(exception);
Assert.That(exception.Message.Contains("actively refused"));
答案 2 :(得分:0)
Error: at Source 'AvengersHeader': Missing column 'URL
源自ExtendedSocketException
(对于.NET Core)。仍然可以通过使用catch SocketException
的catch块来处理。我们可以通过SocketException
进行确认:
System.Type.IsAssignableFrom(Type c)
在xUnit中,断言可以是:
catch (Exception e)
{
Debug.Write(typeof(SocketException).IsAssignableFrom(e.GetType()));
}