views:

204

answers:

2

I have a table aspnet_User in my model(dbml file) where I have a property UserName which is ReadOnly. I thought I could do this.

var mockAsp_NetUser = new Mock<aspnet_User>();
mockAsp_NetUser.SetupGet(au => au.UserName).Returns("JohnDoe");

But then I get an exception: Invalid setup on a non-overridable member.

An easy solution would be to set the ReadOnly property for UserName to false in the model designer. But this might be a hack. Is there a more "correct" way?

+1  A: 

You can't mock what is not either virtual or abstract.

If you are trying to unit test your code, a better approach would be to define an IUser class and let your code work against that interface.

Mark Seemann
I have read that it is "almost impossible" to mock linq tables in datacontext. TypeMock Isolator is able to this, but not Moq.
LencoTB
That is right, TypeMock is a completely different beast than all the other dynamic mocks - for good and evil...
Mark Seemann
A: 

Just an addition to Marks answer:

In the DBML you can set that the property should have "Instance Modifier" = "virtual". By default its set to (None).

For your example that means: In the DBML Designer, select the Member "UserName" and in the Properties you will find "Instance Modifier".

Once set to virtual your code will work.

PeterTheNiceGuy