You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:17:34