Пользовательский поставщик членства для модульного тестирования с NUnit выдает ошибку нулевой ссылки

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

Вопрос

Пытаюсь создать учетную запись пользователя в тесте.Но для получения ссылки на объект не задано значение instanve ошибки объекта при его запуске.

Вот мой класс поставщика членства, он находится в библиотеке классов 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);
        }
    }
}

Вот мой App.Config для моей отдельной библиотеки тестовых классов MyCompany.MyApp.Doman.Test.dll это ссылается на мою библиотеку бизнес-домена выше:

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

Вот мой метод, который выдает "Ссылка на объект не установлена для экземпляра объекта".

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

он выдает запрос поставщику.Строка CreateUser

Это было полезно?

Решение

Я совершенно уверен, что вам следует вызвать provider.Инициализируйте (...) в своем тестовом коде перед вызовом CreateUser.

Другие советы

Ну, не совсем ни у кого не было ответа.csgero был на правильном пути, хотя проблема заключалась в инициализации.Но просто вызвать это напрямую не было решением проблемы.Это работает:

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

Я полагаю, что для создания экземпляра моего поставщика членства напрямую требуется установить свойства конфигурации, обычно хранящиеся в app.config или web.config, а затем вызвать initialize.Однако вызов статического метода CreateUser в классе Mebership приводит к считыванию конфигурации, затем тип, указанный в конфигурации, анализируется, загружается и инициализируется.

Ошибка непосредственно в provider.CreateUser или где-то в стеке внутри него - возможно, вы могли бы проверить наличие null перед вызовом.

Возможно, отсутствует зависимость - есть ли у вас соответствующие библиотеки DLL DB в пути?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top