2009-11-24 6 views
1

J'ai une table aspnet_User dans mon modèle (fichier dbml) où j'ai une propriété UserName qui est ReadOnly. Je pensais pouvoir faire ça.Moq Linq-to-SQL propriété readonly

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

Mais alors j'obtiens une exception: Configuration non valide sur un membre non redéfinissable.

Une solution simple consisterait à définir la propriété ReadOnly pour UserName sur false dans le concepteur de modèle. Mais cela pourrait être un hack. Y a-t-il un moyen plus "correct"?

Répondre

1

Vous ne pouvez pas vous moquer de ce qui n'est ni virtuel ni abstrait.

Si vous essayez de tester votre code unitaire, une meilleure approche consisterait à définir une classe IUser et à laisser votre code fonctionner par rapport à cette interface.

+0

J'ai lu qu'il est "presque impossible" de se moquer des tables linq dans datacontext. TypeMock Isolator est capable de cela, mais pas Moq. – LencoTB

+0

C'est vrai, TypeMock est une bête complètement différente de tous les autres mocks dynamiques - pour le meilleur et pour le pire ... –

1

Juste une réponse plus de marques:

Dans le DBML vous pouvez définir que la propriété doit avoir « instance Modificateur » = « virtuelle ». Par défaut, il est défini sur (Aucun).

Pour votre exemple, cela signifie: Dans DBML Designer, sélectionnez le membre "UserName" et dans les propriétés, vous trouverez "Instance Modifier".

Une fois défini sur virtuel, votre code fonctionnera.