This is as much a note to self as a blog post. I needed to test a method that was dependent on a API with a callback action where T was scoped internal in the library that I was testing. Rather than making the type public I went ahead and tried to mock it anyway 😀
The code that we want to test is called from third party API like
await hubProxyFactory .Create(hubUrl, configureConnection, async p => { proxy = p; await SendQueuedSubscriptions(); p.On<Message>("onEvent", OnEvent); }, Reconnected, FaultedConnection, ConnectionComplete);
Message is a private type and OnEvent is of type Action<Message>. Its the OnEvent method we want to test. So we need to mock On<T> without knowing T and we need to save a reference to the OnEvent even though T is unknown. It looks like this
mock.Setup(x => x.On("onEvent", It.IsAny<Action<It.IsAnyType>>())).Callback( (string e, MulticastDelegate callback) => { onEvent = callback; });(more…)