I am trying to write acceptance testing for an existing app.
I’ve run into a problem though when calling a web service that tells us if a person is, in short, in the office or not, what hours, and who the backup is.
In most of the tests, actually calling the web service is fine… yes, ideally it shouldn’t, but creating inputs and outputs for the many many times this service is called is a HUGE task.
What I’d like to do is have the Mock generate a default result regardless of the input, but it will need to be generated by code based on the parameters as there is temporal data in the call and result.
And, if I choose, to be able to setup a different result on a few select inputs to the method on a test by test scenario.
Basically, by default, people are in the office. Unless I setup the mock for them not to be.
Can I do that with Moq? And how?
I’m pretty new to writing tests and mocking so if you require more clarification, please ask.
You may be able to do that with Moq or another dynamic Mock, but it doesn’t sound like it would be a good idea.
The way you describe your needs it sounds like you want the web service to contain a non-trivial amount of logic – perhaps not as complex logic as the final production web service, but a set of heuristic rules at least. That sounds to me a lot like a Fake instead of a Mock.
In short, a Fake is a lightweight implementation of the dependency.
A Mock, on the other hand, provides more or less pre-canned, static answers to input while verifying whether the input was expected or not. That doesn’t sound at all like what you describe.
In short, the best way to achieve what you describe is to write a lightweight version of the web service that act as you describe. If you need to generate some bogus test data, you can consider using AutoFixture.