0

EDIT

Correct way to override Equals() and GetHashCode() helped me a lot.

Here is the implementation of my customer class:

public abstract class Customer{
    protected string my_edition;
    protected string my_rarity;
    protected ushort my_id;
    protected string my_name;

    public Customer() {
        this.my_edition = "";
        this.my_rarity = "";
        this.my_id = 0;
        this.my_name = "";
    }

    public override bool Equals(object obj) {
        var item = obj as Card;

        if (item == null) {
            return false;
        }

        return this.my_edition.Equals(item.my_edition) && this.my_rarity.Equals(item.my_rarity) && this.my_id.Equals(item.my_id) && this.my_name.Equals(item.my_name);
    }

    public override int GetHashCode() {
        return this.my_id.GetHashCode();
    }
...

My test fails with the error: "Collection not the same! (Element at index 0 do not match.)" But the results are the same, when debugging the test and checking manually.

"Two collections are equal if they have the same elements in the same order and quantity. Elements are equal if their values are equal, not if they refer to the same object. The values of elements are compared using Equals by default."

I was checking that(while debugging) several times, there are not even unwanted spaced inside the strings.

Why does my test fail? How can I improve my methods?

The Test method:

    [TestMethod]
    public void DA_Test_GetCustomers() {
        ///ARRANGE
        ///
        var cust_numbers = new Queue<int>();
        cust_numbers.Enqueue(1001);
        cust_numbers.Enqueue(1003);


        var expected = new List<Customer> {
            new Customer{
                Edition = "Cust",
                Rarity = "R",
                ID = 1001,
                Name = "John Doe",
                Street = "abc",
                ZIP = 54565,
                Country = "abc",
                Routes = new List<Route>{
                    new Route{
                        ID = 1,
                        Name = "Route1"
                    }
                },
                Contacts = new List<Contact>{
                    new Contact{
                        ID = 1,
                        Name = "Contact1"
                    },
                    new Contact{
                        ID = 2,
                        Name = "Contact2"
                    },
                    new Contact{
                        ID = 3,
                        Name = "Contact3"
                    }
                },
                Offsets = new List<Offset>{
                    new Offset{
                        ID = 2,
                        Name = "Offset1",
                        Total = 3,
                        GreaterThan = 0,
                        Operator = "&&"
                    },
                    new Offset{
                        ID = 6,
                        Name = "Offset2",
                        Total = 1,
                        GreaterThan = 0,
                        Operator = "&&"
                    },
                    new Offset{
                        ID = 9,
                        Name = "Offset3",
                        Total = 1,
                        GreaterThan = 0,
                        Operator = "&&"
                    },
                    new Offset{
                        ID = 16,
                        Name = "Offset4",
                        Total = 1,
                        GreaterThan = 0,
                        Operator = "&&"
                    },
                    new Offset{
                        ID = 29,
                        Name = "Offset5",
                        Total = 1,
                        GreaterThan = 40,
                        Operator = "XX"
                    }
                }
            },
            new Customer{
                Edition = "Cust",
                Rarity = "R",
                ID = 1003,
                Name = "John Doe",
                Street = "abc2",
                ZIP = 54654,
                Country = "abc2",
                Routes = new List<Route>{
                    new Route{
                        ID = 2,
                        Name = "Route"
                    }
                },
                Contacts = new List<Contact>{
                    new Contact{
                        ID = 1,
                        Name = "Contact4"
                    },
                    new Contact{
                        ID = 2,
                        Name = "Contact5"
                    },
                    new Contact{
                        ID = 3,
                        Name = "Contact6"
                    }
                },
                Offsets = new List<Offset>{
                    new Offset{
                        ID = 4,
                        Name = "Offset4",
                        Total = 5,
                        GreaterThan = 0,
                        Operator = "||"
                    },
                    new Offset{
                        ID = 5,
                        Name = "Offset5",
                        Total = 4,
                        GreaterThan = 0,
                        Operator = "||"
                    },
                    new Offset{
                        ID = 11,
                        Name = "Offset6",
                        Total = 4,
                        GreaterThan = 0,
                        Operator = "XX"
                    }
                }
            }
        };

        ///ACT
        ///
        var actual = DA.GetCustomers(cust_numbers);

        ///ASSERT
        ///
        Assert.AreEqual(2, actual.Count);
        CollectionAssert.AreEqual(expected, actual);
    }

The tested method:

    public List<Customer> GetCustomers(Queue<int> cust_numbers) {
        var result = new List<Customer>();
        var routes = new List<Route>();
        var contacts = new List<Contact>();
        var offsets = new List<Offset>();

        using (SqlConnection conn = new SqlConnection(ConnectionString)) {
            conn.Open();

            using (SqlCommand command = new SqlCommand("GetCustomer", conn)) {
                command.CommandType = CommandType.StoredProcedure;

                SqlParameter parameter1 = new SqlParameter();
                parameter1.ParameterName = "@Edition";
                parameter1.SqlDbType = SqlDbType.NChar;
                parameter1.Direction = ParameterDirection.Input;
                parameter1.Value = "Cust";

                SqlParameter parameter2 = new SqlParameter();
                parameter2.ParameterName = "ID_Cust";
                parameter2.SqlDbType = SqlDbType.SmallInt;
                parameter2.Direction = ParameterDirection.Input;

                for (int i = cust_numbers.Count; i > 0; i-- ) {
                    parameter2.Value = cust_numbers.Dequeue();

                    command.Parameters.Add(parameter1);
                    command.Parameters.Add(parameter2);

                    using (SqlDataReader reader = command.ExecuteReader()) {
                        while (reader.Read()) {
                            routes.Add(new Route {
                                ID = (ushort)reader.GetInt16(0),
                                Name = reader.GetString(1)
                            });
                        }

                        reader.NextResult();

                        while (reader.Read()) {
                            contacts.Add(new Contact {
                                ID = (ushort)reader.GetInt16(0),
                                Name = reader.GetString(1)
                            });
                        }

                        reader.NextResult();

                        while (reader.Read()) {
                            offsets.Add(new Offset {
                                ID = (ushort)reader.GetInt16(0),
                                Name = reader.GetString(1),
                                Total = reader.GetByte(2),
                                GreaterThan = reader.GetByte(3),
                                Operator = reader.GetString(4)
                            });
                        }

                        reader.NextResult();

                        while (reader.Read()) {
                            result.Add(new Customer {
                                Edition = reader.GetString(0),
                                Rarity = reader.GetString(1),
                                ID = (ushort)reader.GetInt16(2),
                                Name = reader.GetString(3),
                                Street = reader.GetByte(4),
                                ZIP = reader.GetByte(5),
                                Country = reader.GetString(6),
                                Routes = new List<Route>(routes),
                                Contacts = new List<Contact>(contacts),
                                Offsets = new List<Offset>(offsets)
                            });
                        }

                        routes.Clear();
                        contacts.Clear();
                        offsets.Clear();
                        command.Parameters.Clear();
                    }
                };
            }
        }

        return result;
    }
Community
  • 1
  • 1
AJ_83
  • 289
  • 1
  • 8
  • 22
  • I think you need to implement IEqualityComparer – Donal May 14 '15 at 22:38
  • 1
    Do you override `Equals()`? – Jeroen Vannevel May 14 '15 at 22:38
  • Perhaps you'll find Jon Skeet's [answer helpful (who doesn't?)](http://stackoverflow.com/a/12061810/746045) – ethorn10 May 14 '15 at 22:42
  • More info here: http://stackoverflow.com/questions/9317582/correct-way-to-override-equals-and-gethashcode – Jeroen Vannevel May 14 '15 at 22:45
  • @AJ_83: The default comparison is most likely comparing the objects by reference. They may have the same values, but obviously have different addresses in memory. Implementing `IEquatable` is one way to compare by value. – user2588666 May 15 '15 at 02:53
  • Now I comprehend and sucessfully implement IEqualityComparer and override Equals() to my class. I also edited my answer. – AJ_83 May 15 '15 at 11:01
  • How to assert a list within a list? expected.Add(new Customer{ Edition = "Cust", Rarity = "R", ID = 1001, Name = "abc" Types = new List{ new Type_{ ID = 1, Name = "abc" } }, – AJ_83 May 15 '15 at 11:50

0 Answers0