2008-10-09 31 views
0

尝试在测试中创建用户帐户。但是运行它时,获取对象引用不会被设置为对象错误的实例。单元测试具有NUnit的自定义成员资格提供程序会引发空引用错误

这里是我的会员提供者类,它是在类库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> 

这里是我的方法抛出“对象引用未设置为对象的instanve”

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

      MyMembershipProvider provider = new MyMembershipProvider(); 

      provider.CreateUser("Admin", "password", "[email protected]", "Question", "Answer", true, Guid.NewGuid(), out status); 
     } 
    } 

它抛出的provider.CreateUser线

回答

2

我很确定在调用CreateUser之前,应该在测试代码中调用provider.Initialize(...)。

+0

但是你在NameValueCollect中传递了什么? – Coppermill 2009-09-10 16:32:24

0

直接在provider.CreateUser或向下堆栈里面的某处错误 - 也许你可以调用之前检查空。

也许依赖缺失 - 你有相关的数据库DLL的路径?

1

好吧,没有任何人有答案。虽然初始化是问题,但csgero仍处于正确的轨道上。但直接调用并不是一个解决方案。这工作:

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

我相信我的实例成员提供直接要求设置通常存储在App.config或web.config中的配置属性,然后调用初始化。在Mebership类中调用静态CreateUser方法会导致配置被读取,然后在config中指定的类型被解析,加载并初始化。

相关问题