4

私は、コア フレームワークに対して単体テストを作成している最中で、これに遭遇しました。

次のような拡張メソッドがあります。

    public static T ThrowIfDefault<T>(this T self, string variableName)
    {
        if (self.Equals(default(T)))
            throw new ArgumentException(string.Format("'{0}' cannot be default(T)", variableName));
        return self;
    }   // eo ThrowIfDefault<T>

ThrowIfNull<>( Stack Overflow で見た拡張メソッドのバリエーション。

このためのテスト ケースを作成するにあたり、最初にヘルパーを作成しました。

    public void ThrowIfDefaultTestHelper<T>(T value)
    {
        // unit test *itself* requires that a value be specified!!
        Assert.AreNotEqual(default(T), value);

        // Good test
        GenericExtensionMethods.ThrowIfDefault(value, "value");

        // Bad test
        try
        {
            GenericExtensionMethods.ThrowIfDefault(default(T), "value");
        }
        catch (ArgumentException)
        {
            // Expected result
        }
        catch (Exception)
        {
            throw;
        }
    }

そして、次のとおりです。

    [TestMethod()]
    public void ThrowIfDefaultTest()
    {
        ThrowIfDefaultTestHelper<int>(10);
        ThrowIfDefaultTestHelper<Guid>(Guid.NewGuid());
        ThrowIfDefaultTestHelper<DateTime>(DateTime.Now);
        ThrowIfDefaultTestHelper<object>(new { Name = "Test" });    // anonymous object
    }

ユニットテストは、 aNullReferenceExceptionがスローされたときに最後のテストで失敗します。この方法で匿名オブジェクトをテストすることはできませんか?objectdefault(T)

4

1 に答える 1

11

objectありますがdefault(T)、たまたまnullです。これは、null 非許容値型を使用する他のテスト ケースとは異なります。そのため、NullReferenceException期待したものではなく が得られます。

交換すれば

self.Equals(default(T))

EqualityComparer<T>.Default.Equals(obj, default(T))

期待される を取得し始める必要がありますArgumentException

于 2013-04-23T18:49:18.447 に答える