0

与えられたスレッドを調べましたが、C# でパス ケースの実装を見つけることができませんでした (msdn Web サイトには、データテーブル/ジェネリック コレクション アサートの使用法もありません)。

私たちと一緒ではないクライアントのコード(2つのデータテーブルのみが返されます)

datarow dr1 = datatable1.newrow();
dr1[0] = 345;

datarow dr2 = datatable1.newrow()
dr2[0] = 345;

datatable1.rows.add(dr1); //(1)
datatable2.rows.add(dr2); //(2)

私たちの側のコード

Assert.AreEqual(dt1,dt2); //fails!!How to pass this case??
4

4 に答える 4

4

Assert.AreEqualEquals型のメソッド を使用します。DataTableはこのメソッドをオーバーライドしないため、これは参照チェックです。これは、dt1が と等しくないことを意味しdt2ます。

を使用できますCollectionAssertが、これはメンバーの比較を行います。繰り返しますが、DataRowオーバーライドしないEqualsため、参照チェックが行われます。

カスタム比較ロジックを作成してから、次のようなことを行う必要がありますAssert.IsTrue(DataTableComparer.AreEqual(dt1, dt2));

于 2013-08-21T19:48:20.980 に答える
1

あなたのバージョンの AreEqual メソッドは を使用してAssert.AreEqual(Object expected, Object actual)います。これはObject.Equals()、比較に使用されることを意味します。

このコードを実行して、値を確認します。

bool areEqual = dr1.Equals(dr2);

これらは同じ参照ではないため、これは false を返します。のドキュメントを参照してくださいObject.Equals

現在のインスタンスが参照型の場合、Equals(Object) メソッドは参照の等価性をテストし、Equals(Object) メソッドの呼び出しは ReferenceEquals メソッドの呼び出しと同等です。参照の等価性とは、比較されるオブジェクト変数が同じオブジェクトを参照することを意味します。

データを比較するためのより適切な方法を見つける必要があります。DataRowComparer代わりに a を使用して値を比較できます。各行をループして、自分で値を比較することもできます。例については、 dotnetperlsを参照してください。

于 2013-08-21T19:47:49.337 に答える
0

オブジェクトが「Equals」メソッドをオーバーライドしない限り、AreEqual は参照によって比較します

http://social.msdn.microsoft.com/Forums/vstudio/en-US/23703a85-20c7-4759-806a-fabf4e9f5be6/how-to-compare-two-datatablesから貼り付けた以下を試してください。

Assert.IsTrue(ComareDataTables(DTable1,DTable2));

private bool CompareDataTables(DataTable DT1, DataTable DT2)
    {
        if ((DT1 == null) && (DT2 == null))
            return true;
        else if ((DT1 != null) && (DT2 != null))
        {
            if (DT1.Rows.Count == DT2.Rows.Count)
            {
                if (DT1.Columns.Count == DT2.Columns.Count)
                {
                    for (int i = 0; i < DT1.Rows.Count; i++)
                    {
                        for(int j = 0; j<DT1.Columns.Count; j++)
                        {
                            if (DT1.Rows[i][j].ToString() != DT2.Rows[i][j].ToString())
                                return false;
                        }
                    }
                    return true;
                }
                else
                    return false;
            }
            else
                return false;
        }
        else
            return false;
    }
于 2013-08-21T19:50:54.727 に答える
0

独自の CSV 解析ライブラリを開発しているときに、同様の問題が発生しました。単体テストで使用できる方法で例外をスローするアサーションを作成しました。

public static class AssertDataTable {

    public static void AreEqual(DataTable expected, DataTable actual) {
        //If both tables are null we consider them equal.
        if ((expected == null) && (actual == null)) {
            return;
        } else if ((expected != null) && (actual != null)) {
            //Check that the column count is the same
            if ((expected.Columns.Count == actual.Columns.Count)) {
                //Check that the column types are the same
                for (int i = 0; i < expected.Columns.Count; i++) {
                    if (expected.Columns[i].DataType != actual.Columns[i].DataType) {
                        throw new Exception($"The type of of columns is not the same in both tables! Expected:{expected.Columns[i].DataType} Actual:{actual.Columns[i].DataType} for index {i}");
                    }
                }
                //Check that the headers are the same
                for (int i = 0; i < expected.Columns.Count; i++) {
                    if (expected.Columns[i].ColumnName != actual.Columns[i].ColumnName) {
                        throw new Exception($"Column names do not match! Expected:{expected.Columns[i].ColumnName} Actual:{actual.Columns[i].ColumnName} for index {i}");
                    }
                }
            } else {
                throw new Exception("Tables do not have the same number of columns");
            }

            //Up to this point we have verified the columns. Now we are going th verify the rows
            //Just verify the values. Types have already been verified through the column checks.
            if (expected.Rows.Count == actual.Rows.Count) {
                for (int i = 0; i < expected.Columns.Count; i++) {
                    for (int j = 0; j < expected.Rows.Count; j++) {
                        if (!expected.Rows[j][i].Equals(actual.Rows[j][i])) {
                            throw new Exception($"Cells are not equal! In Row {j} and Column {i} Expected {expected.Rows[j][i]} Actual {actual.Rows[j][i]}");
                        }
                    }
                }
                return;
            } else {
                throw new Exception($"Rows count is not equal! Expected{expected.Rows.Count} Actual {actual.Rows.Count}");
            }
        } else {
            //Give more information to the user.
            if (expected == null) {
                throw new Exception("Expected table is null! But Actual table is not.");
            }

            if (actual == null) {
                throw new Exception("Actual table is null! But expected table is not.");
            }
        }
    } //End of Compare Data Datatables
} //End of class

また、 Servygunr2171による提案も考慮しました。コードは、関連するGithub Repoでも見つけることができます

このようにして、次のように単体テストでこのメソッドを使用できます。

[TestMethod]
public void SingleTest() {
    //Arrange
    DataTable expected = new DataTable();
    //Build my table here
    
    //Act
    DataTable actual = CustomMethodToTest();

    //Assert
    AssertDataTable.AreEqual(expected, actual); 
}

この投稿が将来誰かに役立つことを期待して、これを投稿します。

于 2022-01-31T21:24:22.967 に答える