A coworker of mine (who just got back from the Microsoft MVP events in Seattle, congrats, Matt!) has turned me on to using Moq, which I must say is an impressive mocking framework that has made unit testing notably easier.
Recently I had the need to mock the IRequest
interface of the Castle MonoRail framework – specifically, two properties: the indexed property and the QueryString property, both of which expose a NameValueCollection.
I found some guidance on mocking the indexed property via Stack Overflow, which turned me on to the following solution.
var request = new Mock<IRequest>(); request.ExpectGet(r => r[It.Is<string>(x => x == "someName")]).Returns("someValue");
To mock the QueryString
property took a different approach: create a NameValueCollection
, add my test data to it, and wire the collection to the mocked object.
var request = new Mock<IRequest>(); var query = new NameValueCollection(); query.Add("someName", "someValue"); request.ExpectGet(r => r.QueryString).Returns(query);
With this, I can now pass my mocked IRequest
to other classes, which will be able to access the following:
request["someName"] = "someValue"; request.QueryString["someName"] = "someValue";
In all, it makes unit testing web requests a lot easier!