CodeShot

Should().Be() در مقابل Should().BeEquivalentTo()

Should().Be() برابری دقیق (معمولاً Reference Equality برای Object یا Value Equality برای انواع ساده) را چک می‌کند، در حالی که Should().BeEquivalentTo() دو شیء را با مقایسه عمیق و بازگشتی همه Property ها با هم مقایسه می‌کند، بدون توجه به این‌که دو نمونه متفاوت از حافظه باشند.

ویژگیShould().Be()Should().BeEquivalentTo()
نوع مقایسهدقیق (Reference/Value)ساختاری و عمیق
مناسب برایانواع سادهDTO و اشیاء پیچیده
نیاز به Override Equalsبله برای اشیاء پیچیدهخیر

کِی از Should().Be() استفاده کنیم؟

وقتی مقادیر ساده (عدد، رشته، enum) یا دو رفرنس دقیقاً یکسان را مقایسه می‌کنید.

کِی از Should().BeEquivalentTo() استفاده کنیم؟

وقتی می‌خواهید دو شیء پیچیده (DTO، Record) را از نظر مقدار Property هایشان مقایسه کنید بدون اهمیت به این‌که رفرنس یکسان باشند.

مثال Should().Be()

int result = Calculate();
result.Should().Be(42);

مثال Should().BeEquivalentTo()

var actual = new UserDto { Id = 1, Name = "Ali" };
var expected = new UserDto { Id = 1, Name = "Ali" };
actual.Should().BeEquivalentTo(expected);
// موفق حتی اگر دو شیء متفاوت باشند

اشتباه رایج

اشتباه رایج استفاده از Should().Be() برای مقایسه دو شیء پیچیده است؛ چون این متد رفرنس یا Equals پیش‌فرض را چک می‌کند، حتی با مقادیر Property کاملاً یکسان ممکن است تست به‌اشتباه Fail شود مگر کلاس Equals را override کرده باشد.

جمع‌بندی

برای مقادیر ساده و اولیه از Should().Be() و برای مقایسه ساختاری اشیاء پیچیده از Should().BeEquivalentTo() استفاده کنید.