Test d'unité Le fournisseur d'appartenance personnalisé avec NUnit génère une erreur de référence null

StackOverflow https://stackoverflow.com/questions/187125

Question

Essayer de créer un compte d'utilisateur dans un test. Cependant, obtenir une référence à un objet n’est pas défini comme une erreur d’objet lorsqu’il est exécuté.

Voici ma classe de fournisseur MemberShip, située dans une bibliothèque de classes MyCompany.MyApp.Domain.dll:

using System;
using System.Collections.Generic;
using System.Web.Security;

namespace MyCompany.MyApp.Domain
{
    public class MyMembershipProvider : SqlMembershipProvider
    {
        const int defaultPasswordLength = 8;
        private int resetPasswordLength;

        public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {
            resetPasswordLength = defaultPasswordLength;
            string resetPasswordLengthConfig = config["resetPasswordLength"];
            if (!String.IsNullOrEmpty(resetPasswordLengthConfig))
            {
                config.Remove("resetPasswordLength");

                if (!int.TryParse(resetPasswordLengthConfig, out resetPasswordLength))
                {
                    resetPasswordLength = defaultPasswordLength;
                }
            }
            base.Initialize(name, config);
        }

        public override string GeneratePassword()
        {
            return Utils.PasswordGenerator.GeneratePasswordAsWord(resetPasswordLength);
        }
    }
}

Voici mon App.Config pour ma bibliothèque de classes de test séparée MyCompany.MyApp.Doman.Test.dll qui fait référence à la bibliothèque de mon domaine métier ci-dessus:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="SqlServer" connectionString="data source=mycomp\SQL2008;Integrated Security=SSPI;Initial Catalog=myDatabase" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <system.web>
        <membership defaultProvider="MyMembershipProvider" userIsOnlineTimeWindow="15">
            <providers>
                <clear/>
                <add name="MyMembershipProvider"
                     type="MyCompany.MyApp.Domain.MyMembershipProvider,MyCompany.MyApp.Domain"
                     connectionStringName="SqlServer"
                     applicationName="MyApp"
                     minRequiredNonalphanumericCharacters="0"
                     enablePasswordRetrieval="false"
                     enablePasswordReset="true"
                     requiresQuestionAndAnswer="false"
                     requiresUniqueEmail="true"
                     passwordFormat="Hashed"/>
            </providers>
        </membership>
    </system.web>
</configuration>

Voici ma méthode qui jette "Référence d'objet non définie sur l'instance d'un objet"

public class MemberTest
    {
        public static void CreateAdminMemberIfNotExists()
        {
            MembershipCreateStatus status;
            status = MembershipCreateStatus.ProviderError;

            MyMembershipProvider provider = new MyMembershipProvider();

            provider.CreateUser("Admin", "password", "someone@somewhere.co.uk", "Question", "Answer", true, Guid.NewGuid(), out status);
        }
    }

il jette sur la ligne provider.CreateUser

Était-ce utile?

La solution

Je suis tout à fait sûr que vous devriez appeler provider.Initialize (...) dans votre code de test avant d'appeler CreateUser.

Autres conseils

Bien, personne n’a eu la réponse. Csgero était sur la bonne voie, mais le problème était initialiser. Mais simplement appeler cela directement n’était pas une solution. Cela fonctionne:

public class MemberTest
    {
        public static void CreateAdminMemberIfNotExists()
        {
            MembershipCreateStatus status;
            MembershipUser member = Membership.CreateUser("Admin", "password", "email@somewhere.co.uk", "Question", "Answer", true, out status);
        }
    }

Je pense que l’instanciation directe de mon fournisseur d’appartenance nécessite de définir les propriétés de configuration généralement stockées dans le fichier app.config ou web.config, puis d’appeler initialize. L'appel de la méthode statique CreateUser sur la classe Mebership entraîne toutefois la lecture de la configuration, puis le type spécifié dans la configuration est analysé, chargé et initialisé.

L’erreur est-elle directement sur provider.CreateUser ou quelque part dans la pile? Peut-être pourriez-vous vérifier la valeur null avant d’appeler.

Peut-être une dépendance est-elle manquante - avez-vous les dll de base de données pertinentes sur le chemin?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top