تكرار السؤال: …
الإجابة المختصرة
NSubstitute توفر صياغة طبيعية وأنيقة جداً خالية من الـ Lambda Expressions المعقدة (Substitute.For<T>()) وأصبحت الخيار الأكثر أماناً وشعبية في المجتمع الحديث.
الشرح
تستخدم كلاهما لعزل التبعيات والتحقق من استدعاء الدوال. في NSubstitute، كتابة الكود تبدو ككود C# عادي: substitute.Get(1).Returns(user) والتحقق: substitute.Received(1).Save(user)، مقارنة بصياغة Moq المعقدة بالأقواس والـ Expressions: mock.Setup(x => x.Get(1)).Returns(user) و mock.Verify(x => x.Save(user), Times.Once).
مثال بالكود
// NSubstitute
var repo = Substitute.For<IUserRepository>();
repo.GetByIdAsync(1).Returns(new User { Name = "Ali" });
var service = new UserService(repo);
var user = await service.GetUserAsync(1);
Assert.Equal("Ali", user.Name);
await repo.Received(1).GetByIdAsync(1);أخطاء شائعة
- محاولة عمل Mock لفئات عادية لا تمتلك دوالاً افتراضية (Virtual Methods) دون استخدام واجهات (Interfaces).