用于测试依赖的模拟 SignalR 集线器 class

Mock SignalR hub for testing dependent class

我正在尝试实例化一个 class 来处理一系列功能,并且是使用依赖注入构建的。我模拟了两个参数,第三个是内存数据库上下文。现在断言时,它在 mockClientProxyParticipants.Verify() 行抛出错误:

System.NotSupportedException : Invalid verify on an extension method: proxy => proxy.SendAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>())

几乎不可能不调用该函数,并且以 Times.Never() 作为参数调用 Verify() 不会改变任何东西。

我尝试使用 mockClientProxyResults.Verify() 之类的普通字符串设置 Verify() 的 Linq 参数,我尝试使用 It.Is<string>(s => s == "some string") 并尝试 It.IsAny<string>().

我真的不明白现在出了什么问题。这是我的测试代码,如果您想查看更多,请告诉我:

var mockHub = new Mock<IHubContext<VoteHub>>();
var mockClients = new Mock<IHubClients>();
var mockClientProxyParticipants = new Mock<IClientProxy>();
var mockClientProxyResults = new Mock<IClientProxy>();

mockClients.Setup(clients => clients.Group("Participants")).Returns(mockClientProxyParticipants.Object);
mockClients.Setup(clients => clients.Group("Results")).Returns(mockClientProxyResults.Object);
mockHub.Setup(hub => hub.Clients).Returns(mockClients.Object);

var activeQuestionManagerMock = new Mock<IActiveQuestionManager>();
activeQuestionManagerMock.Setup(x => x.GetActiveQuestion())
    .Returns(new ActiveQuestionModel(options));

QuestionHandler qm = new QuestionHandler(new VoteDbContext(options), mockHub.Object, activeQuestionManagerMock.Object);

//Act
qm.Ask(question);

//Assert
mockClientProxyParticipants.Verify(proxy => proxy.SendAsync(It.IsAny<string>(/*s => s == "AskQuestion"*/), It.IsAny<string>(/*s => s == qwaJSON*/), It.IsAny<CancellationToken>()), Times.Once());
mockClientProxyResults.Verify(proxy => proxy.SendAsync("UpdateCurrentQuestionProgress", It.IsAny<ActiveQuestionModel>(), default(CancellationToken)), Times.Once());

原来我误解了错误消息,问题是 IClientProxy.SendAsync() 是一种扩展方法,而起订量显然不喜欢这样。可以使用 SendCoreAsync() 代替,但您始终必须传递一个数组作为参数,即使您只想发送一个对象或根本不想发送任何数据。

归功于 NKosi(请参阅问题评论)