2015-03-24 1 views
2

J'utilise Moq pour se moquer de la classe suivante dans VB:type de fantaisie doit être une interface ou une classe abstraite ou non scellée

Public class Factory(Of T) 
    Inherits Factory 

    Public Overridable Shadows Readonly Property Model() as TModel 
    Get 
     .. 
    End Get 
    End Property 

Lorsque je tente d'utiliser Moq pour se moquer de la propriété du modèle en un test unitaire comme ceci:

Dim factory As New Mock(of Factory(Of TestModel)) 
factory.Setup(Function(i) i.Model).Returns(new TestModel With { .. }) 

Cela échoue avec l'erreur:

System.ArgumentException: Type to mock must be an interface or an abstract or non-sealed class. ---> System.TypeLoadException: Access is denied: 'PA.PSP.PFAD.Mvc.PFADFactory`1[PA.PSP.PFAD.Mvc.OrderExtensionsTest+TestModel]'. Result StackTrace: at System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type) at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() at System.Reflection.Emit.TypeBuilder.CreateType() at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(TypeBuilder type) at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType() at Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(String name, Type[] interfaces, INamingScope namingScope)

Toute idée pourquoi car si ce n'est pas une interface ou abstr t, il n'est pas scellé (ne définit pas NotInheritable dans VB) ....

+0

Vous: 'Dim usine comme nouveau simulacre (de Factory (Of TestModel))' Je me demande si la classe 'TestModel' imbriquée est publique, et si sa classe contenant' OrderExtensionsTest' est également publique? Moq doit créer une classe "à la volée" qui dérive de 'Factory (Of TestModel)' (ou 'PFADFactory (Of TestModel)' comme il est appelé dans le texte d'erreur). –

Répondre

0

Avez-vous essayé de rendre Model() virtuel?

+0

Oui, il est montré dans mon premier exemple –