2010-12-08 31 views
3

mon application a le code suivant:Moq ConfigurationSection

public interface IConfigurationManager { 
    CustomSection Settings { get; } 
} 

public class ConfigurationManager : IConfigurationManager { 
    public CustomSection Settings { get { return (CustomSection)WebConfigurationManager.GetSection("customSettings"); } } 
} 

public class CustomSection : ConfigurationSection { 
    [ConfigurationProperty("transactions", IsRequired = true)] 
    public TransactionsElement Transactions { 
     get { return (TransactionsElement)base["transactions"]; } 
    } 
} 

public class TransactionsElement : ConfigurationElement { 
    [ConfigurationProperty("testStatus", DefaultValue = true)] 
    public bool TestStatus { 
     get { return (bool)base["testStatus"]; } 
     set { base["testStatus"] = value; } 
    } 
} 

Maintenant, dans mon fichier Global.asax.cs j'ai la variable statique suivante définie:

public static CustomSection Settings = ServiceLocator.Current.GetInstance<IConfigurationManager>().Settings; 

Où ConfigurationManager est injecté dans ma demande . Jusqu'ici tout va bien. Maintenant, ce que je veux dire, c'est que s'ils essaient d'accéder à Global.Settings.Transactions.TestStatus dans mes tests unitaires, ils retournent true. C'est là que je suis confus et mes premières tentatives viennent d'être lancées ensemble. J'ai jusqu'à présent (Edited):

var cm = new Mock<IConfigurationManager>(); 
var cs = new Mock<CustomSection>(); 
var te = new Mock<TransactionsElement>(); 

cm.SetupGet(m => m.Settings).Returns(cs.Object); 
cs.SetupGet(s => s.Transactions).Returns(te.Object); 
te.SetupGet(e => e.TestStatus).Returns(true); 

Mais quand je tente d'accéder à Global.Settings.Transactions.TestStatus il génère une erreur nulle. Je plonge juste dans moqueur et apprécierais vraiment l'aide. Merci

Répondre

4

Parce que vous renvoyez un nouvel objet, pas un objet mocké. Vous ne pouvez pas 'Setup' un objet non-proxy.

configurationManager.Setup(c => c.Settings).Returns(new CustomSection());

Le new CustomSection, doit être un objet moqué pour que vous puissiez configurer un Get sur la propriété. Donc, vous devez simuler CustomSection et TransactionElement.