Unit test Il provider di appartenenze personalizzato con NUnit genera un errore di riferimento null

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

Domanda

Prova di creare un account utente in un test. Ma ottenere un riferimento a un oggetto non è impostato su un instanve di un errore di oggetto durante l'esecuzione.

Ecco la mia classe di provider MemberShip, è in una libreria di classi 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);
        }
    }
}

Ecco il mio App.Config per la mia libreria di classi di test separata MyCompany.MyApp.Doman.Test.dll che fa riferimento alla mia libreria di domini aziendali sopra:

<?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>

Ecco il mio metodo che genera "Il riferimento all'oggetto non è impostato su un instanve di un oggetto"

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);
        }
    }

getta sulla linea provider.CreateUser

È stato utile?

Soluzione

Sono abbastanza sicuro che dovresti chiamare provider.Initialize (...) nel tuo codice di test prima di chiamare CreateUser.

Altri suggerimenti

Beh, quasi nessuno ha avuto la risposta. csgero era sulla buona strada sebbene il problema fosse l'inizializzazione. Ma chiamare direttamente non era una soluzione. Questo funziona:

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

Credo che l'istanza del mio provider di appartenenza richieda direttamente l'impostazione delle proprietà di configurazione tipicamente memorizzate in app.config o web.config e quindi la chiamata di inizializzazione. La chiamata del metodo statico CreateUser sulla classe Mebership causa tuttavia la lettura della configurazione, quindi il tipo specificato nella configurazione viene analizzato, caricato e inizializzato.

L'errore è direttamente sul provider.CreateUser o da qualche parte nello stack al suo interno - forse potresti controllare null prima di chiamare.

Forse manca una dipendenza - hai le dll DB rilevanti sul percorso?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top