1
votes

I'm using MvcContrib's test helpers and Rhino Mocks 3.5 to test an ASP.NET MVC action method. I build my fake controller like so:

var _builder = new TestControllerBuilder();
_builder.InitializeController(_controller);

So I get a fake controller that contains fake HTTP Server etc.

I'm then trying to stub the Server.MapPath method like so

controller.Server.Stub(x => x.MapPath(Arg<string>.Is.Anything)).Return("/APP_DATA/Files/");

but in my method under test the call to Server.MapPath("/APP_DATA/Files/") returns null.

This is the test

    const string STOCK_NUMBER_ID = "1";
    const string FULL_FILE_PATH = "App-Data/Files";

    var controller = CreateStockController();
    _uploadedFileTransformer.Stub(x => x.ImageBytes).Return(new byte[10]);
    _uploadedFileTransformer.Stub(x => x.ConvertFileToBytes(FULL_FILE_PATH)).Return(true);

    controller.Server.Stub(x => x.MapPath(Arg<string>.Is.Anything)).Return("/App_Data/Files/");

    controller.AddImage(Guid.NewGuid(), STOCK_NUMBER_ID);

What I am missing?

2
Could we see the test? Looks like a possible missing repository.Playback().PatrickSteele
I've added the test to the OP. I didn't think we needed to use record and playback in Rhino Mocks v3.5 - am I wrong?Simon Lomax
Could you also paste CreateStockController()? I am not familiar with test helper you are using, but where is controller.Server created?Grzenio
Good point, in fact after further investigation I find its not being created. How would I create it and have appear as part of my fake controller? Is it possible? I'm wondering why the MvcContrib Testhelpers don't already do it.Simon Lomax
Record/Playback is not REQUIRED, but some people still use it. Frequently, they do a record(), but forget to execute the playback() and their stubs/mocks don't work. However, I just did a test on a sample MVC project using MVCContrib and I'm seeing the same thing -- the controller.Server is a Rhino.Mocks proxy, but the MapPath stub isn't working. I'm going to play around and see what is happening.PatrickSteele

2 Answers

1
votes

Old post but I was searching for this and I found a solution, MvcContrib's TestHelper probably got it fixed because for me it's working.

_builder.HttpContext.Server.Stub(s => s.MapPath("~/" + filepath)).Repeat.Once().Return(mapedPath);
0
votes

Looks like this is a bug in MVCContrib (at least with what I have on my machine -- v1.0.0.0). When setting up the controller context, it's using Rhino.Mocks record/replay mode, but (and this is the bug), it doesn't put the HttpServer mock into replay mode. It puts everything else in replay mode but not that one.

So a quick fix is to do:

controller.Server.Replay();

As part of your "arrange" section of your test. Then it works fine.