0

3時間以上の欲求不満の後、私は尋ねることにしました。

テストするこの単純なクラスがあります。

public class Organizer {
    private static bool Bongo(String p) {
        return p != null && p.Length >= 5;
    }

    private static int ValidateArgs(String[] args) {
        return args.Length;
    }
}

そして、MSTest を使用して静的メソッドをテストするこのコードがあります。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

public class OrganizerTest {
    [TestMethod]
    public void TestBongo() {
        PrivateType psOrganizers = new PrivateType(typeof(Organizer));

        // This one works fine.
        Assert.IsTrue(Convert.ToBoolean(psOrganizers.InvokeStatic("Bongo", "ABCDEFG")));

        // Fails with: "System.MissingMethodException: Method 'Organizer.Bongo' not Found.
        Assert.IsFalse(Convert.ToBoolean(psOrganizers.InvokeStatic("Bongo", null)));
    }

    [TestMethod]
    public void TestBodo() {
        PrivateType psOrganizers = new PrivateType(typeof(Organizer));

        String[] fakeArray = new String[] { "Pizza" };

        // Fails with: "System.MissingMethodException: Method 'Organizer.ValidateArgs' not Found.
        int result1 = Convert.ToInt32(psOrganizers.InvokeStatic("ValidateArgs", fakeArray));

        // Fails with: "System.MissingMethodException: Method 'Organizer.ValidateArgs' not Found.
        int result2 = Convert.ToInt32(psOrganizers.InvokeStatic("ValidateArgs", "A", "B", "C", "D"));

        // Fails with: "System.MissingMethodException: Method 'Organizer.ValidateArgs' not Found.
        int result3 = Convert.ToInt32(psOrganizers.InvokeStatic("ValidateArgs", new Object[] { "A", "B", "C", "D" }));

        Assert.IsTrue(result1 == 1 && result2 == 4 && result3 == 4);
    }
}

TestBongo の最初の Assert を除いて、MissingMethodException が原因で他のすべての Assert が失敗します。多数の InvokeStatic() オーバーロードがあり、コンパイラが期待するものを選択していない可能性があると思われます。

ところで、プライベート メソッドをテストしないように言わないでください。私は議論を求めていません。:)

ありがとうございました。

4

1 に答える 1

3

最後のパラメーター toInvokeStaticparamsパラメーターであるため、これらのケースではその使用法が少し混乱します。最初のケースでは、null を渡すと、引数なしでメソッドを呼び出そうとしているように見えます。試す

psOrganizers.InvokeStatic("Bongo", new object[] { null })

Bongonullで呼び出す。

2 番目のケースでは、配列の共分散により、String[]は暗黙的に変換可能です。文字列配列は、必要な単一の引数ではなく、引数のリストとして渡されます。正しく機能させるには、文字列配列を別の配列でラップする必要があります。試すObject[]

psOrganizers.InvokeStatic("ValidateArgs", new object[] { new string[] { "A", "B", "C", "D" } })

を呼び出すValidateArgs

于 2015-04-23T17:18:43.980 に答える