我必须为我的单元测试创建owin环境,这是创建Usermanager对象所必需的。在我目前的情况下,我的usermanager为null,因为它没有获得owincontext。
以下是访问usermanger的代码
SELECT STUFF((SELECT '
UNION ALL
SELECT COL1,COL2,COL3..COLN FROM '+TABLE_NAME + ' WHERE ID=1 '
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' FOR XML PATH(''),type).value('.', 'NVARCHAR(MAX)'),1,11,'')
以下是设置usermanager
的代码public SLUser FindByName(string userName)
{
return UserManager.FindByName(userName);
}
我得到的例外
public SLUserManager UserManager
{
get
{
return _userManager ?? HttpContext.Current.GetOwinContext().GetUserManager<SLUserManager>();
}
set
{
_userManager = value;
}
}
我尝试创建运行启动.configureauth()方法的后台线程,该方法创建usermanager对象并创建owien context.so它可以为我的测试方法获取owin上下文。这是一个正确的方法吗??? 建议回复会做
答案 0 :(得分:0)
我可能错了,但听起来问题是你的测试试图使用SLUserManager的真实实现。如果您没有设置此属性,那么当您尝试访问它时,您的代码将尝试创建本地默认值(使用此行代码)
return _userManager ?? HttpContext.Current.GetOwinContext().GetUserManager<SLUserManager>();
您的单元测试有一种方法,因为您的UserManager属性有一个公共设置器,您可以创建一个模拟SLUserManager并在测试中设置它(避免使用本地默认值)
[Test]
public void FindByName_WhenPassedUserName_ReturnsSLUserWithUserName()
{
var myClassBeingTested = "";//create an instance of the class being tested
var mockSLUserManager = "";//create a mock version of SLUserManager
myClassBeingTested.UserManager = mockSLUserManager;
var userName = "mark_h";
var expected = mockSLUserManager.FindByName(userName);
var result = myClassBeingTested.FindByName(userName);
Assert.AreEqual(expected, result);
}
可能很棘手的部分是你的模拟SLUserManager,这是一个你可以在测试环境中完全控制的类。
您不应该针对您无法控制的代码为您创建的SLUserManager的实现进行测试。这不是一个单元测试,因为你不再纯粹测试你的&#34;单位&#34;代码。
在示例中,您提供了实际需要测试的内容? - 你需要在&#34; FindbyName&#34;被调用它将此调用委托给UserManager,然后返回预期的结果。如果您的UserManager损坏并且没有返回SLUser或错误的那个,那么这不是您尝试进行单元测试的代码失败。
为了进一步解释我的观点,您提供的代码非常简单,我假设您确信它是正确的。因此它应该通过单元测试但不是因为&#34; GetUserManager&#34;失败了。您没有编写失败的代码,因此您需要将其与测试隔离并仅测试您正在编写的代码。
如果你是嘲笑的新手,我建议你在进一步讨论之前先阅读一下。