用于测试依赖的模拟 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(请参阅问题评论)
我正在尝试实例化一个 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(请参阅问题评论)