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

时间:2018-08-22 04:34:57

标签: c# asp.net umbraco

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

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

我应该解决什么或错过了什么?任何帮助都将不胜感激!

加油!

2 个答案:

答案 0 :(得分:1)

发生空引用是因为MembersMembershipProvider在构造函数中使用IMembershipMemberService。如果使用不带参数的构造函数,它将尝试从IMembershipMemberService获取ApplicationContext(由于正在运行unittests,因此为null)。您可以将此服务的模拟版本添加到构造函数参数中:

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

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

答案 1 :(得分:0)

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

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

In [114]: def rotate(lst, n):
     ...:     return lst[-n:] + lst[:-n]
     ...: 

In [115]: rotate(a,-2)
Out[115]: [3, 4, 5, 1, 2]

此外,如果您要模拟提供程序,则可以为自定义提供程序创建界面

例如Mock _mbrInfrastructe = new Mock();

这时,您可以依靠obj.Setup调用来增加对单元测试的控制。