1

以下は私の方法です

User UpdateUser(User user)
{
}

このメソッドをテストするたびに、次のようなテストを行います。

ほぼ 20 ~ 30 個のテスト ケースを書きました。

その中で、私は次の方法を使用しました。

テストケースごとに User オブジェクトを作成し、必要な入力を行い、チェックのために間違った入力を行い、最後に DB で更新されたユーザーの詳細を削除します。

例えば

[TestMethod]
void test1()
{
    try
    {
        // Here will call updateUser and do necessarry check
    }
    finally
    {
        // here I'll delete user details from DB
    }
}

[TestMethod]
void test2()
{
    try
    {
        // Here will call updateUser and do necessarry check
    }
    finally
    {
        // here I'll delete user details from DB
    }
}

それはユニットテストの正しい方法ですか?

なぜなら、TestInitialize を使用すると、それもテスト ケースごとに呼び出されるからです。

私は正しい方法でやっていますか、それとも他の方法はありますか?

4

3 に答える 3

4

いいえ、これは単体テストではなく統合テストであるため、正しい方法ではありません。単体テストでは、データベースに触れないでください。代わりに、モックとスタブを使用して動作を模倣します。

あなたの質問が統合テストに関するものである場合、それはちょっとした意見に基づいています。それはあなたが必要とするものを行う限り、あなたのニーズと好みに依存します. このような状況に対処する方法を複数見てきました。最も重要なことは、一貫性を保つことです。1 つのアプローチを選択したら、プロジェクトが終了するまでそれを使い続けて、複数のプログラミング スタイルを混在させないようにします。

于 2013-10-23T11:07:51.960 に答える
0

メソッドを void に変更できれば、メソッドのテストが容易になり、私にとってはより理にかなっています。現在、メソッドは (1) ユーザーを更新し、(2) ユーザーを返すという 2 つのことを行います。1 つのことを行うメソッドをテストする方が常に簡単です。

単体テストでデータベースを実行するべきではありません - モックアップしてください。このように考えてください。インターネットに接続していなくてもテストを実行できるはずです。外部システムにアクセスできないコンテキストでコードがコンパイルされる場合、単体テストは同じコンテキストで実行できるはずです。

UpdateUser クラスを制御できない場合は、単体テストを実行しないでください。コードがそれに依存している場合は、クラスをテストできるように UpdateUser をモックする必要があります。

于 2013-10-23T12:01:44.250 に答える