Pourquoi le bien que je veux pour se moquer besoin d'être virtuel?

Je suis en train de faire quelques tests unitaires, et se moquant de certaines propriétés à l'aide de Moq.

Maintenant, c'est un Contrôleur test (ASP.NET MVC 3). Mon Contrôleurs de dériver à partir d'un résumé contrôleur, nommé AbstractController.

Ce contrôleur a une dépendance sur le Contexte Http (pour faire des choses comme la thématisation, spécifique au domaine de la logique basée sur HTTP en-têtes d'HÔTE, etc).

Cela se fait via une propriété appelée WebSiteSettings:

public abstract class AbstractController : Controller
{
   public WebSiteSettings WebSiteSettings { get; private set; }

   //other code
}

Avis d'un ensemble privé - le ctor il établit. Donc, je l'ai changé pour utilisé une interface, et c'est ce que j'ai raillé:

public IWebSiteSettings WebSiteSettings { get; private set; }

Ensuite, j'ai créé un "FakeWebSiteSettings", qui se moque de la Http Contexte pour lire les en-têtes HTTP.

Le problème c'est que quand je lance le test, je reçois un NotSupportedException:

Non valide le programme d'installation sur un non-virtuel (substituables en VB) membre: x => x.WebSiteSettings

Voici pertinentes se moquant de code:

var mockWebSiteSettings = new Mock<FakeWebSiteSettings>();
var mockController = new Mock<MyController>(SomeRepository);
mockController.Setup(x => x.WebSiteSettings).Returns(mockWebSiteSettings.Object);

_controller = mockController.Object;

var httpContextBase = MvcMockHelpers.FakeHttpContext();
httpContextBase.Setup(x => x.Request.ServerVariables).Returns(new NameValueCollection
    {
        {"HTTP_HOST","localhost.www.mydomain.com"}, 
});
_controller.SetFakeControllerContext(httpContextBase.Object);

Si je fais le WebsiteSettings propriété virtuel - le test passe.

Mais je ne comprends pas pourquoi j'ai besoin pour ce faire. Je ne suis pas vraiment primordial la propriété, je suis tout simplement en se moquant de la façon dont il est installé.

Suis-je raté quelque chose, ou de faire de ce mal?

InformationsquelleAutor RPM1984 | 2011-04-14