Fluent Assertions如何比较TimeSpan?Rx.NET测试断言异常问题
Rx.NET测试中Fluent Assertions断言TimeSpan失败的解决方法
我在Rx.NET和Fluent Assertions环境下编写了如下测试代码:
// Arrange var testScheduler = new TestScheduler(); var udpStream = new Subject<UdpReceiveResult>(); _functionMock.Setup(x => x.CreateListener<UdpReceiveResult>()!.GetStream()).Returns(udpStream); var observer = testScheduler.CreateObserver<TimeSpan>(); var sut = new MySutClass(_functionMock.Object); // Act var subscription = sut.MyMethod(testScheduler).Subscribe(observer); testScheduler.AdvanceTo(TimeSpan.FromSeconds(5).Ticks); udpStream.OnNext(new UdpReceiveResult()); testScheduler.AdvanceTo(TimeSpan.FromSeconds(9).Ticks); udpStream.OnNext(new UdpReceiveResult()); // Assert observer.Messages.Count.Should().Be(1); observer.Messages[0].Value.Should().BeEquivalentTo(TimeSpan.FromSeconds(4));
执行测试后控制台输出提示:
Expected observer.Messages[0].Value to be 4s, but found OnNext (00:00:04)
实际时间值均为4秒,但似乎因比较格式问题导致无法正确匹配,请问该如何解决此断言问题?
问题原因与解决方法
核心问题是你访问的observer.Messages[0].Value并非直接的TimeSpan值,而是Notification<TimeSpan>类型对象——错误提示里的OnNext (00:00:04)就是该对象的字符串输出,包含了通知类型(OnNext)和实际值。
要获取真正的TimeSpan值,需要访问Notification对象的嵌套Value属性,同时对于值类型的TimeSpan,推荐使用Be()方法而非BeEquivalentTo()(后者更适合复杂对象的结构比较)。修正后的断言代码如下:
observer.Messages.Count.Should().Be(1); // 先验证通知类型为OnNext(可选但更严谨) observer.Messages[0].Value.Kind.Should().Be(NotificationKind.OnNext); // 访问嵌套的Value属性获取实际TimeSpan值 observer.Messages[0].Value.Value.Should().Be(TimeSpan.FromSeconds(4));
这样就能精准匹配到期望的4秒时间值,解决断言失败问题。
内容的提问来源于stack exchange,提问作者infinitesimal
相关产品推荐
相关产品推荐

