如何构建单元测试SignalR 2.x实现的模拟集线器?

时间:2014-05-01 15:41:28

标签: unit-testing cookies signalr moq signalr-hub

我正在为SignalR 2.x实施建立单元测试。 我们的实施利用存储在上下文中的访问请求cookie。

因此,为了构建我们的单元测试,我们必须创建一个模拟的cookie集合 并将其与模拟的请求对象相关联。

我已经看到以下代码块在SignalR 1.x中执行此操作:

const string connectionId = "1234";
const string hubName = "Chat"; 
var mockConnection = new Mock<IConnection>();
var mockUser = new Mock<IPrincipal>();
var mockCookies = new Mock<IRequestCookieCollection>();
var mockPipelineInvoker = new Mock<IHubPipelineInvoker>();

var mockRequest = new Mock<IRequest>();
mockRequest.Setup(r => r.User).Returns(mockUser.Object);
mockRequest.Setup(r => r.Cookies).Returns(mockCookies.Object);

StateChangeTracker tracker = new StateChangeTracker();
Clients = new HubConnectionContext(mockPipelineInvoker.Object, mockConnection.Object, hubName, connectionId, tracker);
Context = new HubCallerContext(mockRequest.Object, connectionId);

我遇到了试图创建模拟cookie集合的问题。 上面的IRequestCookieCollection未定义。

var mockCookies = new Mock<IRequestCookieCollection>();

这是否在SignalR库中的其他位置移动了? 或..,有没有不同的方法来做到这一点??

谢谢, JohnB

1 个答案:

答案 0 :(得分:0)

在SignalR 1.0中,IRequest.Cookies的类型已从IRequestCookieCollection更改为IDictionary<string, Cookie>。作为此更改的一部分,IRequestCookieCollection已被删除。

更改mockCookies以反映新类型应解决您的问题:

var mockCookies = new Mock<IDictionary<string, Cookie>>();

然而,嘲弄IDictionary可能会很痛苦,因此使用普通词典可能更容易:

var cookies = new Dictionary<string, Cookie>();
// ...
mockRequest.Setup(r => r.Cookies).Returns(cookies);

https://github.com/SignalR/SignalR/issues/1034