Тестирование SignalR - как смоделировать группы в новой версии SignalR для ASP.NET Core 2
Я пытаюсь написать тест для моего метода Hub, но не знаю как, потому что нет документации или примеров кода для текущей (1.0.0-alpha2-final) версии SignalR. Вот мой код:
[Fact]
public void SaveVisitorInfoTest()
{
//Arrange
var chatHub = new ChatHub();
var mockClients = new Mock<IHubClients>();
chatHub.Clients = mockClients.Object;
dynamic groups = new ExpandoObject();
var groupName = "SomeConversation";
string actualName = null;
string expectedName = "someName";
groups.SendVisitorInfo = new Action<string, string>(n => {
actualName = n;
});
mockClients.Setup(_ => _.Group(groupName)).Returns(groups);
//Act
chatHub.Clients.Group(groupName).InvokeAsync("SendVisitorInfo", expectedName);
// Assert
Assert.Equal(expectedName, actualName);
}
Visual Studio генерирует следующее сообщение об ошибке при выполнении теста:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Moq.Language.Flow.ISetup не содержит определения для "возвратов".
В старых версиях создание фиктивных клиентов и групп выглядит так:
var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
dynamic groups = new ExpandoObject();
groups.SendVisitorInfo = new Action<string, string>(n => {
actualName = n;
});
mockClients.Setup(_ => _.Group(groupName)).Returns((ExpandoObject)groups)
Но я не могу сейчас использовать IHubCallerConnectionContext, поэтому я попытался:
var mockClients = new Mock<IHubClients>();
но я не знаю, как создавать фиктивные группы в этом случае
Извините за мой ужасный английский
1 ответ
У меня недостаточно репутации, чтобы комментировать, но эта ссылка была настолько хороша, насколько я мог найти для тестирования AspNetCore.SignalR v1.0.2:
https://buildingsteps.wordpress.com/2018/06/12/testing-signalr-hubs-in-asp-net-core-2-1/
Это все еще довольно некрасиво.
То, что я хочу быть в состоянии сделать, это
public Task DoCallback(IHubContext<MyHub> hubContext)
{
var clients = m_hubContext.Clients as IHubClients<IMyHubClient>;
clients.Client( "one").myCallback("Hi!");
}
Тогда макет как:
var hubContext = new Mock<IHubContext<MyHub>>();
hubContext.Setup( h => h.Clients )
.Returns( m_hubClients.Object );
var hubClients = new Mock<IHubClients>();
var clientCallbacks = new Mock<IMyHubClient>();
hubClients.As<IHubClients<IMyHubClient>>()
.Setup( c => c.Client( "one" ) )
.Returns( clientCallbacks.Object );
clientCallbacks.Setup( c => c.myCallback( It.IsAny<string>() ) )
.Callback( ( stringp ) =>
{
...etc...
Надеюсь, в будущем выпуске...