0

私はC#での単体テストの世界では初めてです。

私の中にコードがありますMain.cs

public static string Generate(int length)
{
    char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();
    string password = string.Empty;
    Random random = new Random();

    for (int i = 0; i < length; i++)
    {
        int x = random.Next(1, chars.Length);

        if (!password.Contains(chars.GetValue(x).ToString()))
            password += chars.GetValue(x);
        else
            i--;
    }
    return password;
}

今、私はこのコードを単体テストでテストする方法がわかりません。誰かが私に例を教えてもらえますか?

編集:

テストコードを作成しました

    [TestMethod]
    [Timeout(1000)]
    public void RenderingPasswordShouldHaveMaximumSize()
    {
        var amountOfCharacters = Int32.MaxValue;
        var generator = new PasswordGenerator();
        var target = generator.Generate(amountOfCharacters);

        // TODO
        Assert.Fail("This method should throw an exception if you try to create a password with too many characters");
    }

しかし、それは私に次のエラーを与えます:メッセージ:テスト'RenderingPasswordShouldHaveMaximumSize'が実行タイムアウト期間を超えました誰かがこれで私を助けることができますこれは74の最大サイズを持つ必要があります!

4

4 に答える 4

1

を使用した簡単な例NUnit。ここでは、引数として渡すと何も生成されないことをテストしてい0ます(おそらく、?をスローする必要がありExceptionます)。

[TextFixture]
public class Tests {

    [Test]
    public void Test_Length0_ReturnsNothing() {
        string result = Generate(0);

        Assert.IsTrue(string.IsNullOrEmpty(result));
    }
}

次に、同様のテストを作成できます(たとえば、必要な文字が含まれていることを確認するなど)。

于 2013-02-21T08:29:15.597 に答える
1

ユニットテストのアイデアは、あなたの小さな方法に何かを入れて、結果が大丈夫かどうかをチェックすることです。

Visual Studioには、そのためのプロジェクトテンプレートがあります。また、C#でテストするためのNUnitoderXUnitのような他のツールもあります

素晴らしい複数視力コースがあります:

ボブおじさんのウェブキャストでは、テスト駆動開発を実演していますhttp://cleancoders.com/codecast/clean-code-episode-6-part-1/show

msdnの「ユニットテストを使用したコードの検証」も参照してください。

于 2013-02-21T08:30:59.250 に答える
1

単体テストには多くのニュアンスがあります。単体テストに関する本「The Art of Unit Testing: With Examples in .Net」を読むことをお勧めします。

単体テストにおける多くのテクニックとアプローチが説明されています。ここでも多くの例を見つけることができます。

于 2013-02-21T08:42:42.663 に答える
0
var amountOfCharacters = Int32.MaxValue;
var generator = new PasswordGenerator();
var target = generator.Generate(amountOfCharacters);

パスワードに含める必要のある文字数を2,147,483,647文字として指定しています...

chars.Length

配列には74個の可能な値しかありません。

配列内の最後のいくつかの値を見つけようとすると、ループが22億回繰り返されるのに時間がかかるため、タイムアウトになることは間違いありません。

for (int i = 0; i < length; i++)

パスワードの長さではなく、実行する反復回数を指定しているため、ロジックも変更されます。

于 2013-02-21T09:28:45.287 に答える