我正在基于单元框架为我的网站创建单元测试。在我的单元测试中,我需要创建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();
}
}
我应该解决什么或错过了什么?任何帮助都将不胜感激!
加油!
答案 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调用来增加对单元测试的控制。