Grummle

Blog
Résumé

Recursive Mocking: Rhino vs NSubstitute

I'm toying with the idea of ditching Rhino mocks. I've always felt pretty lost when trying to use it and have to look up examples pretty much every time. I rarely 'mock' anything and the stubbing leaves something to be desired from the syntax and usability standpoint.

Anyway what has brought this to a head is that I'm doing a service and it has a dependency on IConfiguration. I knew/know Rhino mocks has a recursive mocking ability so I thought I'd use that.


            IConfiguration config = MockRepository.GenerateMock<IConfiguration>();
            config.Stub(x => x.Data.OurApp.ConnectionString).Return("SomeConnectionString");

            Assert.AreEqual("SomeConnectionString",config.Data.OurApp.ConnectionString);

This works as expected. However if you complicate it a little....

            IConfiguration config = MockRepository.GenerateMock<IConfiguration>();
            config.Stub(x => x.Data.OurApp.ConnectionString).Return("SomeConnectionString");
            config.Stub(x => x.Web.Sites.OurApp.Urls.ClientFiles).Return(new{new Uri("http://www.google.com"));

            Assert.AreEqual("SomeConnectionString",config.Data.OurApp.ConnectionString);
            Assert.AreEqual("http://www.google.com",config.Web.Sites.OurApp.Urls.ClientFiles.ToString());

I start to have issues and I haven't been able to find a way to get it to let me set more then one property recursively.


I just started playing with NSubstitue. Here is the same stuff/more and it works as expected.

            IConfiguration config = Substitute.For();
            config.Data.OurApp.ConnectionString.Returns("asdf");
            config.Data.OurApp2.ConnectionString.Returns("sele");
            config.Paths.PmtaDumpFolder.UncPath.Returns("uncpath");
            config.Paths.PmtaDumpFolder.LocalPath.Returns("localpath");
            config.Web.Sites.OurApp.Urls.ClientFiles.Returns(new Uri("http://www.google.com"));

            Console.WriteLine(config.Data.OurApp.ConnectionString);
            Console.WriteLine(config.Data.OurApp2.ConnectionString);
            Console.WriteLine(config.Paths.PmtaDumpFolder.UncPath);
            Console.WriteLine(config.Paths.PmtaDumpFolder.LocalPath);
            Console.WriteLine(config.Web.Sites.OurApp.Urls.ClientFiles.ToString());

Thoughts feelings?
comments powered by Disqus