我创建了一个SignalR集线器,我想对这个集线器进行单元测试。我已经创建了多个测试,当我一个接一个地开火时,它们都会成功。但是,当我同时运行它们时,测试失败了。失败的原因是此测试使用hub方法检查某些List是否至少有一个值。该测试中的列表应为空,但由于其他测试正在运行,因此列表将填充该列表。
如何运行此测试,以便每个测试都有自己的集线器实例?
正如您在TryConnect()方法中看到的那样,它会检查List ConnectedUsers是否已设置,以及该列表中是否还有 MaxConnectedUsers 。在失败的测试中,不应该设置和填充列表...但是,由于正在运行的其他测试,它是。
我该如何正确测试?
对于每个测试,我创建一个模拟的集线器:
[TestMethod]
public void InitChat_Available()
{
HubWrapper hub = new HubWrapper();
hub.TryConnect();
Assert.AreEqual(1, hub.callerResponse.Count);
Assert.IsFalse((bool)hub.callerResponse[0]);
}
Init方法(在HubWrapper构造函数中调用):
public void Init(string[] clientIds)
{
var connectionId = Guid.NewGuid().ToString();
var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
var groupManagerMock = new Mock<IGroupManager>();
Clients = mockClients.Object;
caller.finishedInit = new Action<bool>((isAvailable) => callerResponse.Add(isAvailable));
mockClients.Setup(m => m.Caller).Returns((ExpandoObject)caller);
Groups = groupManagerMock.Object;
Dictionary<string, object> environment = new Dictionary<string, object>();
environment.Add("server.RemoteIpAddress", "127.0.0.10");
Context = new HubCallerContext(request: new ServerRequest(environment), connectionId: connectionId);
}
Hub TryConnect():
public void InitChat(string clientId)
{
bool isChatAvailable = (ConnectedUsers != null && ConnectedUsers.Count < MaxConnectedUsers);
Clients.Caller.finishedInit(isChatAvailable);
}
我删除了一些(针对此问题)不必要的代码。