Prueba unitaria El proveedor de membresía personalizado con NUnit arroja un error de referencia nulo

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

Pregunta

Intentando crear una cuenta de usuario en una prueba. Pero obtener una referencia de objeto no se establece en una instancia de un error de objeto cuando se ejecuta.

Aquí está mi clase de proveedor MemberShip, está en una biblioteca de clase 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);
        }
    }
}

Aquí está mi App.Config para mi biblioteca de clase de prueba separada MyCompany.MyApp.Doman.Test.dll que hace referencia a mi biblioteca de dominio comercial arriba:

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

Aquí está mi método que arroja " La referencia de objeto no está establecida en una instancia de un objeto "

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

se lanza en la línea del proveedor. Crear usuario

¿Fue útil?

Solución

Estoy bastante seguro de que debe llamar al proveedor. Inicialice (...) en su código de prueba antes de llamar a CreateUser.

Otros consejos

Bueno, no todos tenían la respuesta. csgero estaba en el camino correcto, aunque inicializar era el problema. Pero llamar eso directamente no era una solución. Esto funciona:

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

Creo que crear una instancia de mi proveedor de membresía directamente requiere establecer las propiedades de configuración que generalmente se almacenan en app.config o web.config y luego llamar a initialize. Sin embargo, llamar al método estático CreateUser en la clase Mebership hace que se lea la configuración, luego el tipo especificado en la configuración se analiza, carga e inicializa.

¿Es el error directamente en el proveedor? CreateUser o en algún lugar de la pila dentro de él? Tal vez podría verificar si es nulo antes de llamar.

Quizás falta una dependencia: ¿tiene los dll de DB relevantes en el camino?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top