CodeShot

[Fact] در مقابل [Theory]

[Fact] یک تست ساده و بدون پارامتر است که همیشه با همان شرایط ثابت اجرا می‌شود، در حالی که [Theory] یک تست پارامتری است که همراه با [InlineData]، [MemberData] یا [ClassData] یک بار برای هر مجموعه داده اجرا می‌شود و به شما اجازه می‌دهد یک منطق تست را با چند ورودی مختلف بررسی کنید.

ویژگی[Fact][Theory]
پارامتری بودنخیربله
نیاز به منبع دادهنداردInlineData/MemberData/ClassData
تعداد اجرایک باربه تعداد داده‌ها

کِی از [Fact] استفاده کنیم؟

وقتی یک سناریوی مشخص و ثابت را تست می‌کنید که نیازی به تکرار با ورودی‌های مختلف ندارد.

کِی از [Theory] استفاده کنیم؟

وقتی همان منطق تست باید با چند ورودی و خروجی مورد انتظار متفاوت بررسی شود تا از تکرار کد جلوگیری شود.

مثال [Fact]

[Fact]
public void IsEven_WithFour_ReturnsTrue()
{
    Assert.True(NumberHelper.IsEven(4));
}

مثال [Theory]

[Theory]
[InlineData(2, true)]
[InlineData(3, false)]
public void IsEven_ReturnsExpected(int n, bool expected)
{
    Assert.Equal(expected, NumberHelper.IsEven(n));
}

اشتباه رایج

اشتباه رایج نوشتن چند [Fact] جداگانه و تقریباً تکراری برای هر مقدار ورودی است؛ در حالی که همان منطق را می‌توان با یک [Theory] و چند [InlineData] بسیار تمیزتر و با کد کمتر نوشت.

جمع‌بندی

برای یک سناریوی ثابت از [Fact] و برای بررسی همان منطق با چند مجموعه داده مختلف از [Theory] استفاده کنید.