Mock SignalR концентратор для тестирования зависимого класса - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь создать экземпляр класса, который обрабатывает множество функциональных возможностей и создается с использованием внедрения зависимостей.Я высмеиваю два моих параметра, а третий - контекст базы данных в памяти.Теперь при подтверждении выдается ошибка в строке mockClientProxyParticipants.Verify():

System.NotSupportedException: недопустимая проверка для метода расширения: proxy => proxy.SendAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>())

Это фактическиневозможно не вызвать функцию, и вызов Verify() с Times.Never() в качестве параметра ничего не меняет.

Я попытался настроить аргумент Linq для Verify(), используя обычные строки, такие как для mockClientProxyResults.Verify(), я попытался использовать 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());

1 Ответ

0 голосов
/ 23 мая 2019

Оказывается, я неправильно понял сообщение об ошибке, и проблема в том, что IClientProxy.SendAsync() - это метод расширения, а Moq, видимо, это не нравится.Вместо этого можно использовать SendCoreAsync(), но вам всегда нужно будет передавать массив в качестве параметра, даже если вы хотите отправить только один объект или вообще не хотите отправлять какие-либо данные.

creditНКоси (см. комментарии к вопросу)

...