-
Notifications
You must be signed in to change notification settings - Fork 1
Associated with testing Hub
NightAngell edited this page Feb 23, 2019
·
19 revisions
Knowledge from basics and common are required to understand this topic.
For Context and Groups mocks see here.
public Mock<IHubCallerClients> ClientsMock { get; private set; }
public Mock<IClientProxy> ClientsAllMock { get; private set; }
public Mock<IClientProxy> ClientsAllExceptMock { get; private set; }
public Mock<IClientProxy> ClientsCallerMock { get; private set; }
public Mock<IClientProxy> ClientsClientMock { get; private set; }
public Mock<IClientProxy> ClientsClientsMock { get; private set; }
public Mock<IClientProxy> ClientsGroupMock { get; private set; }
public Mock<IClientProxy> ClientsGroupExceptMock { get; private set; }
public Mock<IClientProxy> ClientsGroupsMock { get; private set; }
public Mock<IClientProxy> ClientsOthersMock { get; private set; }
public Mock<IClientProxy> ClientsOthersInGroupMock { get; private set; }
public Mock<IClientProxy> ClientsUserMock { get; private set; }
public Mock<IClientProxy> ClientsUsersMock { get; private set; }
Do not use
ClientsMock
directly to verify its child (child is for example: Clients.Caller). Use child mock instead to do this (for Clients.Caller it is ClientsCallerMock). Direct use ofClientsMock
can cause unexpected behaviour when you try verify something.
- Create Hub
- Assign to Hub required properties using
AssignToHubRequiredProperties
- Invoke Hub method
- Verify (Below example how do this)
public void TestedMethodName_TestScenario_ExpectedResult()
{
//Arrange
var exampleHub = new ExampleHub();
AssignToHubRequiredProperties(exampleHub);
//Act
//Assume DoSomething call inside:
//Clients
// .Caller
// .SendAsync("NotifyAboutSomethingAwesome", "First argument", "SecondArgument");
exampleHub.DoSomething();
//Assert
//Here we must use SendCoreAsync instead of SendAsync,
//because SendAsync is static method (extension method)
//This is no big problem see SendAsync vs SendCoreAsync below.
ClientsCallerMock
.Verify(
x => x.SendCoreAsync(
"NotifyAboutSomethingAwesome",
new object[] {"First argument" , "SecondArgument"},
It.IsAny<CancellationToken>())
);
}
SendAsync method is extension method (static method) then we cannot mock it. But, it use internally SendCoreAsync, then we can use it instead. For example:
//Instead this
ClientsCallerMock
.Verify(
x => x.SendAsync(
"NotifyAboutSomethingAwesome",
"First argument",
"SecondArgument",
It.IsAny<CancellationToken>())
);
//We can use this, and this simple trick resolve entire problem.
ClientsCallerMock
.Verify(
x => x.SendCoreAsync(
"NotifyAboutSomethingAwesome",
new object[] {"First argument" , "SecondArgument"},
It.IsAny<CancellationToken>())
);