Пользовательский поставщик членства для модульного тестирования с NUnit выдает ошибку нулевой ссылки
-
06-07-2019 - |
Вопрос
Пытаюсь создать учетную запись пользователя в тесте.Но для получения ссылки на объект не задано значение 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 в пути?