Comment se moquer de la WCF client à l'aide de Moq?

Dans mon projet, j'ai utilisé: SL5+ MVVM+ Prisme + FMC + Rx + Moq + Silverlight Framework de Test Unitaire.

Je suis nouveau à l'unité-des tests et ont récemment commencé en DI, les Modèles (MVVM) etc. Donc le code suivant a beaucoup de possibilités d'amélioration (n'hésitez pas à rejeter l'ensemble de l'approche que je prends si vous pensez que oui).

Pour accéder à mes services WCF, j'ai créé une classe factory comme ci-dessous (encore une fois, il peut être imparfaite, mais s'il vous plaît jetez un oeil):

namespace SomeSolution
{
    public class ServiceClientFactory:IServiceClientFactory
    {
        public CourseServiceClient GetCourseServiceClient()
        {
            var client = new CourseServiceClient();
            client.ChannelFactory.Faulted += (s, e) => client.Abort();
            if(client.State== CommunicationState.Closed){client.InnerChannel.Open();}
            return client;
        }

        public ConfigServiceClient GetConfigServiceClient()
        {
            var client = new ConfigServiceClient();
            client.ChannelFactory.Faulted += (s, e) => client.Abort();
            if (client.State == CommunicationState.Closed) { client.InnerChannel.Open(); }
            return client;
        }

        public ContactServiceClient GetContactServiceClient()
        {
            var client = new ContactServiceClient();
            client.ChannelFactory.Faulted += (s, e) => client.Abort();
            if (client.State == CommunicationState.Closed) { client.InnerChannel.Open(); }
            return client;
        }
    }
}

Il implémente une interface simple comme ci-dessous:

public interface IServiceClientFactory
{
    CourseServiceClient GetCourseServiceClient();
    ConfigServiceClient GetConfigServiceClient();
    ContactServiceClient GetContactServiceClient();
}

Dans mes VMs je suis en train de faire DI de la classe ci-dessus et à l'aide de Rx appeler WCF comme ci-dessous:

var client = _serviceClientFactory.GetContactServiceClient();
try
{

    IObservable<IEvent<GetContactByIdCompletedEventArgs>> observable =
        Observable.FromEvent<GetContactByIdCompletedEventArgs>(client, "GetContactByIdCompleted").Take(1);

    observable.Subscribe(
        e =>
            {
                if (e.EventArgs.Error == null)
                {                                    
                    //some code here that needs to be unit-tested

                }
            },
        ex =>
        {
            _errorLogger.ProcessError(GetType().Name, MethodBase.GetCurrentMethod().Name, ErrorSource.Observable, "", -1, ex);
        }
        );
    client.GetContactByIdAsync(contactid, UserInformation.SecurityToken);
}
catch (Exception ex)
{
    _errorLogger.ProcessError(GetType().Name, MethodBase.GetCurrentMethod().Name, ErrorSource.Code, "", -1, ex);
}

Maintenant je veux créer des tests unitaires (oui, ce n'est pas TDD). Mais je ne comprends pas par où commencer. Moq je ne peux pas se moquer de la BlahServiceClient. Aussi pas de svcutil interface généré peut aider parce que les méthodes asynchrones ne font pas partie de l'auto-générés IBlahService interface. Je préfèrent étendre (par le biais des classes partielles, etc) de l'auto généré des classes, mais je n'aimerais pas que d'opter pour la créer manuellement le code svcutil peut générer (franchement, compte tenu du temps et du budget).

Quelqu'un peut s'il vous plaît aider? Une aiguille dans la bonne direction serait m'aider beaucoup.

"//du code ici que doit être l'unité testé" - Ce genre de code ? Parce que je pense que vous testez la mauvaise chose. Si vous voulez de l'unité de tester le code avant de la tester isolé dans le scénario sans WCF et tout le service de l'infrastructure.
C'est très vrai Michal. Je devrais refactoriser mon code pour isoler la logique de la WCF appel. Merci beaucoup.
Il n'y a pas beaucoup de refactoriser ici. Il suffit de mettre votre "code" dans son propre méthode et de tester cette méthode. Pas besoin de tester la WCF choses, puis.
dans mon cas, j'ai juste fait de la création d'un service. Nous voulons l'unité de tests pour s'assurer de faire des appels via wsdl fonctionne toujours, donc nous avons besoin d'un sweet de tests. Donc, je suis en train de test unitaire mon service méthodes...comme si je suis un client de consommer le Service Web. Donc, mon intention est d'appeler les méthodes spécifiées dans le fichier WSDL comme un hypothétique client/consommateur de mon web service. Maintenant, d'autre part, j'pouvez également créer des tests unitaires dans mon projet de SErvice lui-même pour tester les méthodes? Pas sûr de ce que pour l'unité de test.
qu'est-ce que client.ChannelFactory faire?

OriginalL'auteur Dharmesh | 2012-12-27