views:

42

answers:

2

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.

+1  A: 

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.

Mark Seemann
I've created a fake implementation that generates and returns an expected fake result on all normal calls. When I want to have a special case, like out of office, it contains a "cache" that I can populate the result from the test and will be returned when the parameters match.
Chad
+1  A: 

There is a misunderstood difference bethween mocks and stubs [Martin Forler: Mock Aren't Stubs (http://martinfowler.com/articles/mocksArentStubs.html]. Basically the mock objects serves as the objects with the mechanism that allows you to verify that the method tested during some testing scenario (mostly the Unit tests) is using the object correctly (ie. verify that the tested method called the mock object's methods in correct order, set the parameters and accessed the property three times ...). The mock serves for purpose of testing the method within the unit test whether it is using another objects that are beyond it's boundaries correctly. On the other hand the stubs are simulating some behavior (this is what I think you seek).

Martin Macak