无法在单元测试中创建 Umbraco MembersMembershipProvider

Can not create Umbraco MembersMembershipProvider in unit test

我正在基于单元框架为我的网站创建单元测试。在我的单元测试中,我需要创建 Umbraco 的 MembersMembershipProvider,但它抛出了 null 异常:

System.NullReferenceException : Object reference not set to an instance of an object.
   at Umbraco.Web.Security.Providers.MembersMembershipProvider..ctor()
   at Tests.Controllers.MemberControllerTests.Test_ValidateUser() in 

这是我的单元测试:

[TestFixture]
public class Test_ProxyMembershipProvider
{
    [Test]
    public void Test_ValidateUser()
    {
        var s = new MembersMembershipProvider();
    }
}

我应该修复什么或者我遗漏了什么?非常感谢任何帮助!

加油!

出现空引用是因为MembersMembershipProvider在构造函数中使用了IMembershipMemberService。如果您使用不带参数的构造函数,它将尝试从 ApplicationContext 中获取 IMembershipMemberService(这是 null,因为您是 运行 单元测试)。您可以将此服务的模拟版本添加到构造函数参数中:

var mServiceMock = new Mock<IMembershipMemberService>();
var s = new MembersMembershipProvider(mServiceMock.Object);

有关 MembersMembershipProvider 的更多实施细节,请查看 github sourcecode

我最近遇到了同样的问题。我能够通过将 app.config 文件添加到我的测试项目来解决问题。

在 app.config 文件中,您将需要 system.web/membership 部分。如果您使用 Sql 提供商,您还需要一个 connectionStrings 部分。

<configuration>
  <connectionStrings>
    <add name="MyDataBase"
   connectionString="data source=localhost;Integrated Security=SSPI;Initial Catalog=MyDataBase"
   providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <membership defaultProvider="UnitTestSqlMembershipProvider">
      <providers>
        <clear/>
        <add
  name="UnitTestSqlMembershipProvider"
  type="Membership.Unit.Provider.UuuSqlMembershipProvider, Membership.Unit.Provider, Version=1.0.0.0, Culture=neutral"
  connectionStringName="MyDataBase"
  applicationName="mylittleapp"
  enablePasswordRetrieval="false"
  enablePasswordReset="true"
  requiresQuestionAndAnswer="true"
  requiresUniqueEmail="true"
  passwordFormat="Hashed"
  maxInvalidPasswordAttempts="3"
  passwordAttemptWindow="10"
  minRequiredPasswordLength="8"
  minRequiredNonalphanumericCharacters="0" />
      </providers>
    </membership>
  </system.web>
</configuration>

此外,如果您想模拟您的提供者,则可以为您的自定义提供者创建一个接口

例如 Mock _mbrInfrastructe = new Mock();

此时您可以依靠 obj.Setup 调用来添加对单元测试的额外控制。