/ / Výnimka vyvolaná počas testu vedie k tomu, že položka už bola pridaná do slovníka - c #, testovanie jednotiek, výnimka, členstvo asp.net

Výnimka hodená počas testu vedie k tomu, že položka už bola pridaná do slovníka - c #, unit-testing, výnimka, asp.net-členstvo

Snažím sa vykonať túto testovaciu metódu, ale vyvolá to výnimku. Keď prechádzam kódom, aby som sa pokúsil izolovať výnimku, ktorá ma vedie k:

public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)

pod skúšobnou metódou. Tu je uvedená výnimka s nasledujúcou správou

"Item has already been added. Key in dictionary: "john"  Key being added: "john"".

Nie som si istý, kam ísť odtiaľto. Môže ma niekto nasmerovať správnym smerom? Aj moja testovacia metóda je stále v prevádzke, takže ak vidíte nejaké chyby, pokiaľ chyby priamo nespôsobia vyhodenie výnimky, prehliadnite ich.

    [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;
}

odpovede:

1 pre odpoveď č. 1

Do členstva Uľívateµská kolekcia nemôľete uklada »viac používateľov s rovnakým menom. Indexuje sa podľa užívateľského mena, a preto vám neumožňuje pridať viac užívateľských mien Členstva.

Problém je v metóde GetUserFromModel (). Vyhľadávacie meno používa ako meno používateľa, pretože nájde 2 používateľov s menom „john“ v ich menách a vytvorí 2 používateľov s menom „john“. Možno by namiesto pôvodného užívateľského mena, ktoré bolo použité na vyhľadávanie, malo použiť svoje pôvodné používateľské meno.


0 pre odpoveď č. 2

Ak sú niektoré z objektov vášho poskytovateľa členstvastatický alebo zdieľaný odkaz a vy pridávate používateľa „john“ do viacerých testov, potom máte rasový stav, pretože testy sa vykonávajú paralelne / viacvláknovo. Na vyriešenie musíte nakonfigurovať testovacie nastavenie / roztrhnutie. ktorý vymaže dátové štruktúry za test a vykoná ich postupne alebo ich zalomí do vlastného objektu naprogramovaného na rozhranie, ktoré môžete zosmiešniť.