无法在单元测试中创建 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 调用来添加对单元测试的额外控制。
我正在基于单元框架为我的网站创建单元测试。在我的单元测试中,我需要创建 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 调用来添加对单元测试的额外控制。