0

このテスト メソッドを実行しようとしていますが、例外がスローされます。コードをステップ実行して例外を分離しようとすると、次のようになります。

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

2 に答える 2

1

同じ名前の複数のユーザーを MembershipUserCollection に格納することはできません。これはユーザー名によって索引付けされるため、名前ごとに複数の MembershipUsers を追加することはできません。

問題は GetUserFromModel() メソッドにあります。検索名をユーザーの名前として使用しています。これは、名前に「john」が含まれる 2 人のユーザーを検索しているため、ユーザー名が「john」の 2 人のユーザーを作成しているためです。おそらく、検索に使用された部分的なユーザー名ではなく、元のユーザー名を使用する必要があります。

于 2013-06-07T14:52:04.237 に答える
0

メンバーシップ プロバイダー オブジェクトのいずれかが静的または共有参照であり、複数のテストで "john" ユーザーを追加している場合、テストが並列/マルチスレッドで実行されるため、競合状態が発生します。解決するには、テストごとにデータ構造をクリアするテストのセットアップ/ティアダウンを構成し、それらを順番に実行するか、これらのオブジェクトをモックできるインターフェイスにプログラムされたカスタム オブジェクトにラップする必要があります。

于 2013-06-07T14:37:19.713 に答える