C# 测试期间引发异常,导致项已添加到字典中
我试图执行这个测试方法,但它抛出了一个异常。当我逐步通过代码尝试隔离异常时,它会导致我:C# 测试期间引发异常,导致项已添加到字典中,c#,unit-testing,exception,asp.net-membership,C#,Unit Testing,Exception,Asp.net Membership,我试图执行这个测试方法,但它抛出了一个异常。当我逐步通过代码尝试隔离异常时,它会导致我: public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) 试验方法如下所示。异常在这里抛出,并显示以下消息 "Item has already been added. Key in dictionar
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
试验方法如下所示。异常在这里抛出,并显示以下消息
"Item has already been added. Key in dictionary: 'john' Key being added: 'john'".
我不知道从这里到哪里去。有人能给我指出正确的方向吗?此外,我的测试方法仍在使用中,因此如果您看到任何错误,除非这些错误直接导致抛出异常,否则请忽略它们
[TestMethod]
public void TestFindUsersByName()// filed a bug in TFS
{
try
{
//set test to create user
MembershipProvider prov = this.GetMembershipProvider();
MembershipCreateStatus status;
//creates users
MembershipUser user1 = prov.CreateUser("johnUser1", "12345", "johnUser1@asc.edu", "", "", true, null, out status);
MembershipUser user2 = prov.CreateUser("johnUser2", "12345", "johnUser2@asc.edu", "", "", true, null, out status);
//gets users
user1 = prov.GetUser("johnUser1", false); //not checking if user is online. Argument should be false. Not yet implemented
user2 = prov.GetUser("johnUser2", false);
int pageSize = 5;
int pageIndex = 0;
int totalRecords = 5;
MembershipUserCollection coll = prov.FindUsersByName("john", pageIndex, pageSize, out totalRecords);
Assert.AreEqual(1, coll.Count);
List<string> usernames = new List<string>();
foreach (MembershipUser user in coll)
{
usernames.Add(user.UserName);
}
Assert.IsNotNull(usernames);
//Assert.IsTrue(usernames.Contains("john"));
//Deletes Users
prov.DeleteUser("johnUser1", true);
prov.DeleteUser("johnUser2", true);
//Tries to get users again
user1 = prov.GetUser("johnUser1", false);
user2 = prov.GetUser("johnUser2", false);
//test that no users are returned
Assert.AreEqual(null, user1);
Assert.AreEqual(null, user2);
}
catch (Exception ex)
{
LogMessage(ex);
Assert.Fail(ex.Message);
}
}
// MembershipProvider.FindUsersByName
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
{
MembershipUserCollection users = new MembershipUserCollection();
try
{
Profile.MembershipMapper memberMapper = new MembershipMapper();
List<Profile.Membership> recs = (List<Profile.Membership>)memberMapper.GetMembershipsByUsername(_memberUtil.GetApplicationId(), usernameToMatch, pageIndex, pageSize, out totalRecords);
foreach (Profile.Membership rec in recs)
{
users.Add(GetUserFromModel(rec, usernameToMatch));
}
}
catch (Exception ex)
{
Exception e = CheckEventLog(ex, "FindUsersByName");
throw e;
}
return users;
}
private MembershipUser GetUserFromModel(Profile.Membership membership, string username)
{
MembershipUser u = new MembershipUser(this.Name,
username,
membership.userId,
membership.email,
"",
"",
true,
false,
this.GetDate(membership.createDate),
this.GetDate(membership.lastLoginDate),
this.GetDate(null),
this.GetDate(membership.lastPasswordChangedDate),
this.GetDate(null));
return u;
}
[TestMethod]
public void testFindUserByName()//在TFS中提交了一个错误
{
尝试
{
//设置测试以创建用户
MembershipProvider prov=this.GetMembershipProvider();
成员资格和状态;
//创建用户
MembershipUser user1=prov.CreateUser(“johnUser1”、“12345”、“12345”)johnUser1@asc.edu“,”,”,true,null,out状态);
MembershipUser user2=prov.CreateUser(“johnUser2”、“12345”和johnUser2@asc.edu“,”,”,true,null,out状态);
//获取用户
user1=prov.GetUser(“johnUser1”,false);//不检查用户是否联机。参数应为false。尚未实现
user2=prov.GetUser(“johnUser2”,false);
int pageSize=5;
int pageIndex=0;
int totalRecords=5;
MembershipUserCollection coll=prov.FindUsersByName(“john”,pageIndex,pageSize,out totalRecords);
Assert.AreEqual(1,coll.Count);
列表用户名=新列表();
foreach(coll中的MembershipUser用户)
{
usernames.Add(user.UserName);
}
Assert.IsNotNull(用户名);
//Assert.IsTrue(usernames.Contains(“john”));
//删除用户
prov.DeleteUser(“johnUser1”,真实);
prov.DeleteUser(“johnUser2”,真实);
//尝试再次获取用户
user1=prov.GetUser(“johnUser1”,false);
user2=prov.GetUser(“johnUser2”,false);
//测试是否没有返回任何用户
arenequal(null,user1);
arenequal(null,user2);
}
捕获(例外情况除外)
{
日志信息(ex);
断言失败(例如消息);
}
}
//MembershipProvider.FindUserByName
public override MembershipUserCollection FindUserByName(字符串UserName匹配、int pageIndex、int pageSize、out int totalRecords)
{
MembershipUserCollection用户=新建MembershipUserCollection();
尝试
{
Profile.MembershipMapper memberMapper=new MembershipMapper();
List recs=(List)memberMapper.GetMembershipsByUsername(_memberUtil.GetApplicationId(),usernameToMatch,pageIndex,pageSize,out totalRecords);
foreach(记录中的Profile.Membership记录)
{
添加(GetUserFromModel(rec,usernameToMatch));
}
}
捕获(例外情况除外)
{
异常e=检查事件日志(例如,“FindUserByName”);
投掷e;
}
返回用户;
}
私有成员身份用户GetUserFromModel(Profile.Membership成员身份,字符串用户名)
{
MembershipUser u=新的MembershipUser(this.Name,
用户名,
membership.userId,
membership.email,
"",
"",
是的,
假,,
这个.GetDate(membership.createDate),
此.GetDate(membership.lastloginandate),
此.GetDate(null),
this.GetDate(membership.lastPasswordChangedDate),
这个.GetDate(null));
返回u;
}
如果您的任何成员资格提供程序对象是静态的或共享引用,并且您正在多个测试中添加“john”用户,那么当测试以并行/多线程方式执行时,您就有了竞争条件。要解决此问题,您必须配置一个测试设置/拆卸,以清除每个测试的数据结构,并按顺序执行它们,或者将这些对象包装在一个自定义对象中,该对象编程到一个可以模拟的接口。您不能在MembershipUserCollection中存储多个同名用户。
它按用户名编制索引,因此可以防止您为每个名称添加多个MembershipUsers
问题出在GetUserFromModel()方法中。它使用搜索名称作为用户名称,因为它正在查找名称中包含“john”的2个用户,它正在创建用户名为“john”的2个用户。它可能应该使用他们的原始用户名,而不是用于搜索的部分用户名。我想到了多个同名“John”的用户。然而,“约翰”在这个测试中是独一无二的。“John”的信息被添加到数据库中,然后是我得到的错误消息。我应该仍然使用建议的解决方案吗?您的单元测试不应该修改您的数据库!!您需要模拟安全对象并以您希望的方式“欺骗”响应,而不是依赖DB进行测试!我是测试新手,在项目启动后很早就加入了这个项目。该数据库专门用于测试。我已经读到应该使用嘲弄,但目前我正在处理我所得到的东西。关于如何解决这个问题,我还有其他建议吗?表格开始时,用户名中没有“John”的所有用户,但是没有完全清除。我删除为用户John添加的记录,然后重试。我得到同样的错误,你的工作流程或逻辑中一定有错误,这种情况才会发生。继续查找。我正在添加两个用户,johnUser1和johnUser2。我正在搜索用户名中带有“John”的所有用户GetUserFromModel是否返回正确的MembershipUser?不知何故,MemberShipUserCollection.Add()被调用了两次,调用的名称相同。此外,MembershipMapper是否返回了重复项?是的。我相信你