[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] استفاده کنید.
